【问题标题】:'utf-8' codec can't decode byte 0xa0 in position 4276: invalid start byte“utf-8”编解码器无法解码位置 4276 中的字节 0xa0:无效的起始字节
【发布时间】:2018-06-12 13:05:29
【问题描述】:

我尝试阅读并打印以下文件:txt.tsv (https://www.sec.gov/files/dera/data/financial-statement-and-notes-data-sets/2017q3_notes.zip)

根据 SEC,数据集以单一编码提供,如下所示:

制表符分隔值 (.txt):utf-8,制表符分隔,\n 终止的行,第一行包含小写的字段名称。

我当前的代码:

import csv

with open('txt.tsv') as tsvfile:
    reader = csv.DictReader(tsvfile, dialect='excel-tab')
    for row in reader:
        print(row)

所有尝试都以以下错误消息结束:

'utf-8' 编解码器无法解码位置 4276 中的字节 0xa0:无效起始字节

我有点失落。谁能帮我?非常感谢。

【问题讨论】:

  • 我们能看到你正在使用的文件吗?
  • 另外,这是 Python 2 还是 3?答案非常很重要,因为csv 模块在 Python 2 上因非 ASCII 而损坏。
  • 我使用的是 Python 3.6.0
  • 嗯...在重新阅读错误时,我很确定问题出在您的输入文件上。该错误表明它正在尝试将其读取为utf-8,因此您的输入可能不符合所描述的格式。也就是说,您链接的文件似乎很好地遵循它(它是纯 ASCII AFAICT;它使用一些不寻常的 ASCII 控制字符,但它们都在 ASCII 范围内),所以我不确定你会在哪里看到\xa0 字节。有没有可能是你在使用前不小心修改了文件?
  • 见下方 Kopytok 的回答。如果我将编码更改为“windows-1252”,它会完美运行。

标签: python csv encoding utf-8


【解决方案1】:

文件中的编码是“windows-1252”。使用:

open('txt.tsv', encoding='windows-1252')

【讨论】:

  • 非常感谢!!这样可行!我可以问你为什么它可以与“windows-1252”一起使用,尽管 SEC 声明它是“utf-8”?
  • 你确定是cp1252吗?我下载的文件似乎是 ASCII。如果它不是 UTF-8,也不是 ASCII,它实际上可能是任何单个字节/字符的 ASCII 超集,您只能启发式地猜测编码(它会在其中任何一个下成功解码,但是结果可能是垃圾)。
  • @Vital 最好问问 SEC
  • 这有可能产生无效结果。 CP-1252 会愉快地解码任何东西(音频数据、核心转储、zip 档案)并假装它们都是有效文本。
  • 对我下载的txt.tsv 的随意检查表明问题中指出的偏移量处没有 0xa0 字符,但有很多 0xa0 字符显然代表硬空格,而 0xac 字符位于指示货币指标以及 0xae 显然是 ®‎ 符号。这与 CP1252 或 ISO-8859-1(当然非常相似)几乎一致,但 0xac 两者都不符合。也许也可以看看cdn.rawgit.com/tripleee/8bit/master/encodings.html#ac(咳嗽。)
【解决方案2】:

如果有人处理土耳其数据,那么我建议这行:

df = pd.read_csv("text.txt",encoding='windows-1254')

【讨论】:

    【解决方案3】:

    我对 .csv 文件有相同的错误消息,这对我有用:

         df = pd.read_csv('Text.csv',encoding='ANSI')
    

    【讨论】:

      【解决方案4】:
      ds = pd.read_csv('/Dataset/test.csv', encoding='windows-1252') 
      

      对我来说很好用,谢谢。

      【讨论】:

        【解决方案5】:

        如果输入有一个杂散的'\xa0',那么它不是UTF-8,句号。

        是的,您必须将其重新编码为 UTF-8(请参阅:iconvrecode 命令,或者许多文本编辑器和 IDE 都可以这样做),或者使用 8 位编码读取它(正如所有其他答案所暗示的那样)。

        你应该问自己的是 - 这个字符到底是什么(0xa0 或 160)? 好吧,在许多 8 位编码中,它是一个不间断的空格(如 HTML 中的  )。对于至少一个 DOS 编码,它是一个带重音的“a”字符。这就是为什么您需要查看从 8 位编码解码它的结果。

        顺便说一句,有时人们说“UTF-8”,他们的意思是“我猜主要是 ASCII”。如果它是一个不间断的空间,它们就不会那么远:

        In [1]: '\xa0'.encode()
        Out[1]: b'\xc2\xa0'
        

        一个额外的 '\xc2' 字节可以解决问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-01-11
          • 2021-06-12
          • 2021-10-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-10
          • 2020-06-22
          相关资源
          最近更新 更多