Python无法打开UTF-8编码的文本文件

时间:2018-03-08 18:01:47

标签: python powershell utf-8

我有.py脚本,其中包含以下代码以打开特定文本文件(由Exchange Powershell生成):

with codecs.open("C:\\Temp\\myfile.txt",encoding="utf_8",mode="r",errors="replace") as myfile:
    content = myfile.readlines() #here we convert lines to list
    print(content)

然而,我也尝试了utf-16-be和utf-16-le(显然是标准ASCII),但文件输出仍然看起来像这样(这只是它的一部分):

['��\r', '\x00\n', '\x00D\x00o\x00m\x00a\x00i\x00n\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00\r', '\x00\n', '\x00-\x00-\x00-\x00-\x00-\x00-\x00 

我要打开的文件是located here

有人请知道我做错了什么吗?这是一种不同的编码吗?

3 个答案:

答案 0 :(得分:2)

首先,本文绝对不是UTF-8,因此Python无法将其作为UTF-8编码的文本文件打开。

其次,你声称你已经尝试过utf-16-be和utf-16-le"但是没有表明你是怎么做到的,我怀疑你做错了。

从输出中,很可能是BOM编码的UTF-16-LE。

前两个字节 - 由于您打印它们的方式,我们无法分辨它们是哪个字节,但这就是打印出\xFF和{时的样子{1}}字节。其余的字符串是一堆NUL偶数字节,与看起来合理的字节交替,这几乎总是意味着UTF-16-LE。另外,最常见的带有BOM的双字节是UTF-16-LE,而且您使用所有Microsoft工具这一事实更有可能。

所以,如果你真的尝试\xFE,你几乎肯定会得到正确的字符串,但在开始时额外加utf-16-le

但当然正确答案是将其解码为“utf-16'”,这将正确使用和使用BOM。

答案 1 :(得分:1)

您收到错误的原因是您尝试以UTF-8打开以“UTF-16”编码的文件。

UTF-16允许字节顺序标记(BOM)(值为U + FEFF的代码点)位于第一个实际编码值之前。 字节顺序标记(BOM)是一个Unicode字符,U + FEFF字节顺序标记(BOM),其外观作为文本流开头的幻数可以向使用该文本的程序发出信号:

  • 文本流存储在哪个字节顺序或字节顺序中;该 事实上,文本流是Unicode,具有很高的可信度;

  • 将文本流编码为的几种Unicode编码中的哪一种。

  • BOM使用是可选的,如果使用,应该出现在。的开头 文本流。

如果你打开文件为“rb”,即打算将其作为字节流读取,这应该是输出的第一行: -

b'\xff\xfe\r\x00\n'

这是我正在讨论的BOM。

如果您运行以下代码: -

with open("myfile.txt", "r", encoding="utf-16") as file:
    for line in file.readlines():
        print(line)

您的输出没有错误。

如果出于某种特定原因需要使用UTF-8,请尝试以字节格式更新输入文件并删除第一行,即b'\xff\xfe\r\x00\n' 虽然我不确定具体细节。

更多参考: - ]

BOM

UTF-16

答案 2 :(得分:0)

只需使用"utf-16"而不是"utf_8"