【问题标题】:Unable to read file as plain text无法将文件读取为纯文本
【发布时间】:2019-04-12 07:39:09
【问题描述】:

我有一个 powershell 脚本,我试图读入它并对其进行一些分析。我只能将其读取为字节而不是纯文本。

f=open('~/Data/3 - Get-Services - Jobs Version 1.0.ps1','r')
txt=f.read()

当我尝试上面的代码时,我抛出了一个错误。

UnicodeDecodeError: 'utf-8' 编解码器无法在位置解码字节 0xff 0:无效的起始字节

所以,我尝试将其读取为字节,然后将其解码为纯文本,但我仍然抛出错误。

f=open('~/Data/3 - Get-Services - Jobs Version 1.0.ps1','rb')
txt=f.read()
txt.decode('utf-8')

UnicodeDecodeError: 'utf-8' 编解码器无法在位置解码字节 0xff 0:无效的起始字节

我在命令行上查找了数据,发现所有文件都以“��”开头。我觉得这个字符导致了问题,但我不知道如何解决这个问题。

你能帮忙吗

【问题讨论】:

标签: python python-3.x file


【解决方案1】:

编辑:尽管有四票赞成,但我的猜测是错误。在 UTF-8 编码中,BOM 看起来像 0xEF,0xBB,0xBF,所以第一个字节是 0xEF 而不是 0xFF

0xFF,0xFE 表示一个 little-endian UTF-16 文件的开始。为此使用utf-16 编码!


我的猜测是开头的两个“未知”字符是Unicode BOM (byte-order mark)

如果是这种情况,请使用utf-8-sig instead of utf-8 进行解码。无需先读取字节;您可以将encoding 直接传递给open() 函数:

f = open('~/Data/3 - Get-Services - Jobs Version 1.0.ps1', 'r', encoding='utf-8-sig')

【讨论】:

  • @SridharMurali 那是因为我犯了一个错误,看看我的编辑!
【解决方案2】:

我引用了 error UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte 的 Peter Ogden 的答案(不是公认的答案)。

我在遇到同样的错误时遇到了这个帖子,之后 做一些研究我可以确认,这是一个错误,当 您尝试使用 UTF-8 解码 UTF-16 文件。

对于 UTF-16,第一个字符(UTF-16 中为 2 个字节)是字节顺序 标记(BOM),用作解码提示,不显示为 解码字符串中的字符。这意味着第一个字节将是 FE 或 FF,第二个,另一个。

在找到真正答案后进行了大量编辑

因此,更改为 UTF-16 应该可以解决您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 2011-06-10
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    相关资源
    最近更新 更多