Python 3在打印时给出UnicodeDecodeError错误: 'utf-8'编解码无法解码字节错误的CSV文件。
Python 3在打印时给出UnicodeDecodeError错误: 'utf-8'编解码无法解码字节错误的CSV文件。
我在Python 3中有以下代码,它的作用是打印出csv文件中的每一行。
import csv with open('my_file.csv', 'r', newline='') as csvfile: lines = csv.reader(csvfile, delimiter = ',', quotechar = '|') for line in lines: print(' '.join(line))
但是当我运行它时,它给我这个错误:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x96 in position 7386: invalid start byte
我查看了csv文件,发现如果我取出一个单独的ñ(带有波浪符号的小写n),每行都可以正常打印出来。
我的问题是,我已经查看了许多类似问题的解决方案,但我仍然不知道如何解决这个问题,解码/编码是什么,等等。简单地从数据中取出ñ字符是不可行的。
admin 更改状态以发布 2023年5月25日
with open('my_file.csv', 'r', newline='', encoding='ISO-8859-1') as csvfile:
ñ字符没有列在UTF-8编码中。为了解决这个问题,您可以使用ISO-8859-1编码。有关此编码的更多详细信息,您可以参考下面的链接:
https://www.ic.unicamp.br/~stolfi/EXPORT/www/ISO-8859-1-Encoding.html
我们知道该文件包含字节b'\x96'
,因为它在错误消息中提到:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x96 in position 7386: invalid start byte
现在我们可以编写一个小脚本,找出是否存在某种编码,使得b'\x96'
解码为ñ
:
import pkgutil import encodings import os def all_encodings(): modnames = set([modname for importer, modname, ispkg in pkgutil.walk_packages( path=[os.path.dirname(encodings.__file__)], prefix='')]) aliases = set(encodings.aliases.aliases.values()) return modnames.union(aliases) text = b'\x96' for enc in all_encodings(): try: msg = text.decode(enc) except Exception: continue if msg == 'ñ': print('Decoding {t} with {enc} is {m}'.format(t=text, enc=enc, m=msg))
得到:
Decoding b'\x96' with mac_roman is ñ Decoding b'\x96' with mac_farsi is ñ Decoding b'\x96' with mac_croatian is ñ Decoding b'\x96' with mac_arabic is ñ Decoding b'\x96' with mac_romanian is ñ Decoding b'\x96' with mac_iceland is ñ Decoding b'\x96' with mac_turkish is ñ
因此,尝试将
with open('my_file.csv', 'r', newline='') as csvfile:
改为其中一种编码,例如:
with open('my_file.csv', 'r', encoding='mac_roman', newline='') as csvfile: