Python读取二进制文件时nul字符被忽略、内容失真问题求解
问题原因
你遇到的是文件打开模式使用错误导致的内容丢失/修改问题:
- 如果你用文本模式(
r/w/a不带b后缀)打开文件,Python会默认按照指定编码(无指定时用系统默认编码)把二进制字节解码为字符串,解码过程中会对控制字符、无效编码字节做默认处理,nul值(\x00)就属于会被过滤/转义的控制字符范围,部分场景下甚至会被当作字符串终止符截断后续内容。 - 你之前处理jpg、ppt没有出问题,大概率是当时碰巧用了二进制模式读写,或者文本模式下读取时这些文件的字节序列刚好没有触发编码错误和控制字符过滤逻辑,属于偶然情况。
解决方案
要原样保留所有二进制内容,全程用二进制模式读写文件即可:
- 读取文件时指定打开模式为
rb(read binary),读取得到的是bytes类型,不会做任何编码转换,所有字节包括nul都会完整保留:# 二进制文件读取示例 with open("目标文件路径", "rb") as f: content = f.read() - 写入文件时指定打开模式为
wb(write binary),直接写入bytes类型内容即可完整输出所有字节:# 二进制文件写入示例 with open("输出文件路径", "wb") as f: f.write(content) - 如果需要查看字节对应的二进制值,可以直接对
bytes对象的每个元素做转换,不会出现内容丢失:# 示例:输出前5个字节的二进制表示 for byte in content[:5]: print(bin(byte)[2:])
如果确实需要将二进制内容转换为字符串类型做处理,可使用latin1编码做转换,该编码对所有0-255的字节都有唯一映射,不会丢失任何内容:
# bytes转字符串不丢失内容的方法 str_content = content.decode("latin1") # 写回时重新编码为bytes即可 content = str_content.encode("latin1")
内容的提问来源于stack exchange,提问作者Jumanji176
相关产品推荐
相关产品推荐

