Python 3在打印时给出UnicodeDecodeError错误: 'utf-8'编解码无法解码字节错误的CSV文件。

20 浏览
0 Comments

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日
0
0 Comments

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

0
0 Comments

我们知道该文件包含字节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:

0