如何在python 3.9中将二进制文件读取为文本



我有一个.sql文件,我想读到我的python会话(python 3.9)。我正在使用文件上下文管理器打开。

with open('file.sql', 'r') as f:
text = f.read()

当我打印文本时,我仍然得到二进制字符,即xffxferx00nx00-x00-...等。

我已经尝试了所有的参数,如'rb',encoding='utf-8等,但结果仍然是二进制文本。应该注意的是,我之前在我的代码中多次使用了这个相同的过程,这并不是一个问题。

python 3.9有什么变化吗?

前两个字节xffxfe看起来像BOM(Byte Order Mark)
和维基百科页面BOM表显示xffxfe可以表示编码UTF-16-LE

你可以试试

with open('file.sql', 'r', encoding='utf-16-le') as f:

编辑:

有一个模块chardet,你也可以尝试使用它来检测编码。

import chardet 
with open('file.sql', 'rb') as f:  # read bytes
data = f.read()
info = chardet.detect(data)
print(info['encoding'])
text = data.decode(info['encoding'])

通常文件没有BOM,但如果他们有,那么你可以尝试使用unicodebook.readthedocs的例子来检测它。io/guess_encoding check-for-bom-markers

from codecs import BOM_UTF8, BOM_UTF16_BE, BOM_UTF16_LE, BOM_UTF32_BE, BOM_UTF32_LE
BOMS = (
(BOM_UTF8, "UTF-8"),
(BOM_UTF32_BE, "UTF-32-BE"),
(BOM_UTF32_LE, "UTF-32-LE"),
(BOM_UTF16_BE, "UTF-16-BE"),
(BOM_UTF16_LE, "UTF-16-LE"),
)
def check_bom(data):
return [encoding for bom, encoding in BOMS if data.startswith(bom)]
# ---------
with open('file.sql', 'rb') as f:  # read bytes
data = f.read()
encoding = check_bom(data)
print(encoding)     
if encoding:
text = data.decode(encoding[0])
else:
print('unknown encoding')

最新更新