防止将BOM自动添加到bytearray

时间:2015-02-21 07:16:34

标签: python python-2.7 unicode bytearray python-unicode

我正在把这头发撕掉。

我有一个bytearray:

output = bytearray()

我有一个memoryview,映射到从文件读取的bytearray:

ba = bytearray(os.path.getsize(filename))
with open(filename, 'rb') as fin:
    fin.readinto(ba)
mv = memoryview(ba)

现在,我这样做:

output += mv[pos:pos + length]

但是......在字节数组的开头增加了一个3字节的BOM!

我已经尝试了所有我能想到的东西,例如,output = bytearray('', encoding='cp437')但是仍然会出现那个被遗忘的BOM!

如何防止自动添加BOM?

1 个答案:

答案 0 :(得分:2)

好的,首先,我要向所有加入这场疯狂追逐的人道歉。错误是我的,而不是Python的。

让我解释一下:

我们有两个目录STAGINGDEV。前者代表运行良好的代码(并且适合移交给QA),后者包含开发中的代码,可能还有错误。只有通过一系列测试后,才能将“毕业”从DEV转为STAGING。

STAGING中的代码使用我在评论中提到的io.BytesIO机制。 DEV中的代码用bytearray替换BytesIO。

团队中的某个人无意中替换了一对测试文件,让我们称他们为test-inputtest-reference。因此,我们现在有两对测试文件:STAGING/test-inputSTAGING/test-referenceDEV/test-inputDEV/test-reference

现在,错误喜剧开始了。

STAGING中的test-对是纯二进制文件。当@ user2357112在上面的评论中询问时,我正在检查STAGING中的test-文件。那么,那里没有BOM。

但是,DEV中的test-对完全不同。输入是二进制的,但输出是XML 。团队成员使用第三方工具提取XML文件,该工具删除了BOM

我在STAGING和DEV之间进行区分时发现了这一点,我发现test-文件对的大小不同

所以,我在STAGING中劫持了经过验证的正确函数,以正确解压缩DEV\test-input文件......并且whaddaya知道了!它有BOM !!

(为了保护团队成员,较新的test-文件对 更大,大约是“原始”test-文件对的3倍,所以它< em>应该更好地捕获边缘情况)

由于这个愚蠢的错误&gt;我们失去了一天的生产力。&lt;

为了防止类似事件发生,我们将实施以下目标:

  • 所有测试文件都是chmod 0444以防止覆盖。

  • 团队的政策将更新为明确禁止替换已知良好的测试文件。

  • 犯错误的团队成员将被迫将团队视为1品脱啤酒,每个: - )

再次感谢您的帮助。我为你浪费的时间道歉。