我在Python3中有以下代码,这意味着要打印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),每一行都打印得很好.

我的问题是,我已经研究了一系列类似问题的不同解决方案,但我仍然不知道如何解决这个问题,解码/编码什么,等等.简单地go 掉数据中的ñ字符不是一个选项.

推荐答案

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

因此,try 改变

with open('my_file.csv', 'r', newline='') as csvfile:

其中一种编码,例如:

with open('my_file.csv', 'r', encoding='mac_roman', newline='') as csvfile:

Python-3.x相关问答推荐

如何获得给定列表中所有可能的元素组合?

如何定义既允许固定单词又允许模式的pydanti.BaseModel?

按小时和日期对Pandas 数据帧进行分组

使用递归将int转换为字符串

正确的本地react 方式-Django身份验证

向前/向后移动导致移动行的数据不可见

Python中根据分组/ID对两个数据框进行映射,以更接近值的升序排列

pytorch 中 mps 设备的 manual_seed

如何在 20 秒后重复使用 Pillow 在现有图像上创建新图像?

在 python pandas 中设置条件和分配新值

双轴上的刻度和标签

将元组列表转换为以整个元组为键的字典列表

过滤查询集和Q运算符的不同值

Pandas数据单调行为

Python - 如何从同一台客户端机器运行多个Flask应用程序

如何获得 BeautifulSoup 标签的所有直接子代?

使用 Tensorflow 2.0 在 MNIST 上实现自定义神经网络?

如何遍历某些扩展名的文件?

为现有项目创建virtualenv

异常被忽略是什么类型的消息?