我正在把这头发撕掉。
我有一个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?
答案 0 :(得分:2)
好的,首先,我要向所有加入这场疯狂追逐的人道歉。错误是我的,而不是Python的。
让我解释一下:
我们有两个目录STAGING
和DEV
。前者代表运行良好的代码(并且适合移交给QA),后者包含开发中的代码,可能还有错误。只有通过一系列测试后,才能将“毕业”从DEV转为STAGING。
STAGING中的代码使用我在评论中提到的io.BytesIO
机制。 DEV中的代码用bytearray
替换BytesIO。
团队中的某个人无意中替换了一对测试文件,让我们称他们为test-input
和test-reference
。因此,我们现在有两对测试文件:STAGING/test-input
,STAGING/test-reference
,DEV/test-input
和DEV/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品脱啤酒,每个: - )
再次感谢您的帮助。我为你浪费的时间道歉。