Python读取文件时如何保留转义序列不自动解码?
解决Python读取文件时保留八进制转义字符串的问题
你遇到的核心问题是:Python默认以文本模式读取文件时,会自动按系统默认编码把字节解码为Unicode字符,那些不可打印或无法正常解码的字节就会变成乱码(比如你看到的���k���)。而你需要的是像Emacs那样,把原始二进制数据以三位八进制转义序列(比如\240)的形式完整保留并输出。
这里有两种针对性的解决方案,你可以根据文件的实际存储情况选择:
方案一:读取原始字节并手动格式化为八进制转义
如果你的文件里存储的是原始二进制数据(Emacs自动用八进制转义可视化显示),直接用二进制模式读取,再把每个字节转换成对应的转义字符串即可:
with open("/path/to/file", "rb") as file: for byte_line in file: # 遍历每行的每个字节,格式化为\ooo的三位八进制转义形式 escaped_line = ''.join(f'\\{oct(byte)[2:].zfill(3)}' for byte in byte_line) print(escaped_line)
代码说明:
"rb"模式:以二进制只读模式打开文件,读取到的是原始字节串,不会做任何自动解码操作。oct(byte)[2:]:将字节转换为八进制字符串,去掉Python自带的0o前缀。zfill(3):确保八进制数是三位长度,比如十进制128的字节会被格式化为200,最终输出\200。join:把所有字节的转义字符串拼接成完整一行,和原文件的行结构保持一致。
方案二:读取文本时保留转义序列(针对文件存储转义文本的情况)
如果你的文件里实际存储的就是\240\263...这类转义文本字符(而非原始二进制),可以用文本模式读取,同时确保转义序列不被自动解析:
with open("/path/to/file", "r", encoding="ascii", errors="backslashreplace") as file: for line in file: print(line.rstrip('\n'))
不过这种情况比较少见,通常Emacs显示的八进制转义是对原始二进制的可视化,所以方案一更贴合你的需求。
运行方案一的代码后,你就能得到和Emacs里显示完全一致的\240\263\205k\347\301\360G...格式输出了。
内容的提问来源于stack exchange,提问作者Sim




