一些 gsutil 用户在运行 gsutil rsync 时报告失败,我已经追踪到这显然是 Python 2.7.8 特定的问题:我们编写了以二进制模式同步的源目录和目标目录的排序列表('w+b'),然后以二进制模式 ('rb') 读回这些列表。这在 Python 2.6.x 和 Python 2.7.3 下工作正常,但在 Python 2.7.8 下,输出以看起来乱码的二进制格式结束,然后在读回时无法正确解析。
如果我将输出切换为使用“w+”模式,问题就会消失。但是 (a) 我想我确实想以二进制模式编写,因为这些文件可以包含 Unicode,并且 (b) 我想了解为什么这是一个依赖于 Python 版本的问题。
有人知道为什么会发生这种情况吗?
仅供引用,我试图用一个只以二进制模式写入文件并以二进制模式读回的短程序重现此问题,但该程序不会重现该问题。我想知道 heapq.merge 实现是否在 Python 2.7.8 中发生了变化,这可能解释了这个问题(我们分批排序,单个排序的文件很好;它是 heapq.merge 的输出在 Python 2.7.8 下以二进制模式出现乱码)。
如有任何建议/想法,我们将不胜感激。
最佳答案
在我看来,好像文件对象没有被正确刷新,或者在读写操作之间没有进行查找,反之亦然。二进制对象更容易受到这种影响,因为操作系统也不会进行换行符转换。在 C 级别,可以触发未定义的行为,然后读取或写入未初始化的内存。在 http://bugs.python.org/issue1394612 有一个关于此的 Python 问题.
然而,为什么这个在 Python 次要版本中发生变化很有趣,如果你有一个可重现的案例,你应该明确地向 Python project issue tracker 报告它。 .
如果您只是在编写 Unicode,则编码该 Unicode 为 UTF 编码;您不需要为此使用二进制文件模式,因为 UTF-8 永远不会在其他代码点中使用换行字节。
或者,使用 io.open()
function为您的数据打开支持 Unicode 的文件对象。
关于python - 使用 heapq.merge 编写排序输出的奇怪 Python 版本相关行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24976474/