Python 3 CSV 文件给出 UnicodeDecodeError: 'utf-8' codec can't decode byte error when I print

新手上路,请多包涵

我在 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),每一行都可以打印出来。

我的问题是我已经查看了很多类似问题的不同解决方案,但我仍然不知道如何解决这个问题,解码/编码什么等等。简单地取出数据中的 ñ 字符不是一个选项.

原文由 HLH 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 619
2 个回答

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

原文由 unutbu 发布,翻译遵循 CC BY-SA 3.0 许可协议

with open('my_file.csv', 'r', newline='', encoding='ISO-8859-1') as csvfile:

ñ 字符未列为 UTC-8 编码。要解决此问题,您可以改用 ISO-8859-1 编码。有关此编码的更多详细信息,您可以参考以下链接: https ://www.ic.unicamp.br/~stolfi/EXPORT/www/ISO-8859-1-Encoding.html

原文由 Sir Markpo 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题