"utf-8"编解码器无法解码字节0x89

14
我想读取一个csv文件并处理一些列,但是我一直遇到问题。卡在以下错误:
Traceback (most recent call last):
  File "C:\Users\Sven\Desktop\Python\read csv.py", line 5, in <module>
    for row in reader:
  File "C:\Python34\lib\codecs.py", line 313, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x89 in position 446: invalid start byte
>>> 

我的代码

import csv
with open("c:\\Users\\Sven\\Desktop\\relaties 24112014.csv",newline='', encoding="utf8") as f:
    reader = csv.reader(f,delimiter=';',quotechar='|')
    #print(sum(1 for row in reader))
    for row in reader:
        print(row)
        if row:
            value = row[6]
            value = value.replace('(', '')
            value = value.replace(')', '')
            value = value.replace(' ', '')
            value = value.replace('.', '')
            value = value.replace('0032', '0')
            if len(value) > 0:
                print(value + ' Length: ' + str(len(value)))

我是一名Python初学者,尝试使用Google搜索,但很难找到正确的解决方案。

有人可以帮助我吗?


1
你能分享你的CSV文件或其中的部分吗? - user1767754
6
你确定文件是真正以UTF-8编码的吗?如果文件来自于西方国家的Excel,则尝试使用“'cp1252'”编码。所有支持的编码请参考:https://docs.python.org/2/library/codecs.html#standard-encodings - David Aurelio
1
你为什么要以UTF-8格式打开文件?你确定这是该文件的正确编解码器吗? - Martijn Pieters
2
89 不是有效的 UTF8 字节,因此“错误”是正确的,你的文件没有进行 UTF8 编码。就我而言,问题解决了。 - Jongware
2
尝试使用“latin1”编码,其中所有字节值都是合法的。 - martineau
1
将编码更改为“cp1252”解决了问题 - 谢谢! - Sven
3个回答

8
.png 文件的第一个字节是 0x89。这并不代表这就是你的问题,但是 .png 头文件是被专门设计成不会被 错误地解释为文本 的。

我不知道为什么你会有一个实际上是 .png 的 .csv 文件。但如果有人意外重命名了该文件,则肯定会发生这种情况。在 Windows 10 上,由于复选框功能,我偶尔会意外批量重命名文件。为什么微软决定让桌面机具有与平板电脑相同的 UI 控件是个好主意...我不知道。


我正在处理一个文件,它是png格式的,也就是说我知道它是png格式,并且应该是这样的,但我仍然遇到了这个错误。 - Karina Klinkevičiūtė

7
这是最重要的线索:
无效的起始字节
"\x89"并不像评论中所建议的那样是一个无效的UTF-8字节。它是一个完全有效的续字符。这意味着如果它跟随正确的字节值,它可以正确编码UTF-8:

http://hexutf8.com/?q=0xc90x89

要么你没有像预期的那样使用UTF-8数据,要么你有一些格式不正确的UTF-8数据。Python编解码器只是让你知道它在序列中遇到了错误顺序的\x89

(有关连续字节的更多信息,请参见这里: http://en.wikipedia.org/wiki/UTF-8#Codepage_layout)


2
你会推荐什么来诊断接下来需要做什么吗? - ScottieB

4

当我尝试读取或上传以下类型的文件时,也遇到了类似的错误:

  1. CSV文件
  2. JPEG文件
  3. PNG文件
  4. Zip文件

避免出现如下错误的最佳方法是:

  1. 'utf-8'编解码器无法解码字节0x89。
  2. 'utf-8'编解码器无法解码字节0xff。

将这些文件读取为字节。 当您将它们视为字节时,不需要在此处提供任何编码值。因此,当您打开它们时应该指定:

with open(file_path, 'rb') as file:

或者,在您的情况下,代码应该类似于:

import csv

with open("c:\\Users\\Sven\\Desktop\\relaties 24112014.csv", newline='', 'rb') as f:

reader = csv.reader(f,delimiter=';',quotechar='|')

这个固定了我的上传zip和jpeg文件。 - Rahul Bhiwagade

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接