使用heapq.merge编写排序输出的奇怪的Python版本相关行为

时间:2014-07-26 23:34:00

标签: python

某些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版本的问题。

有没有人对为什么会发生这种情况有任何想法?

仅供参考,我尝试使用一个简短的程序来重现这个问题,该程序只是以二进制模式写入文件并以二进制模式将其读回,但问题不在于此程序。我想知道是否可能有一些关于在Python 2.7.8中改变的heapq.merge实现可以解释这个问题(我们分批排序,单个排序文件很好;它从heapq.merge得到的输出在Python 2.7.8下以二进制模式出现乱码。

任何建议/想法都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

听起来好像文件对象没有被正确刷新,或者在读写操作之间没有进行任何搜索,反之亦然。二进制对象更容易受此影响,因为操作系统也不会进行换行转换。在C级别,可以触发未定义的行为,然后读取或写入未初始化的内存。在http://bugs.python.org/issue1394612处有一个Python问题。

为什么在Python次要版本中更改这一点很有意思,如果你有一个可重现的案例,你应该明确地将它报告给Python project issue tracker

如果您只是编写Unicode,那么该Unicode编码为UTF编码;你做需要使用二进制文件模式,因为UTF-8永远不会在其他代码点使用换行字节。

或者,使用io.open() function为您的数据打开支持Unicode的文件对象。