在 pandas 中读取 csv 文件的编码类型

问题描述 投票:0回答:3

好吧,所以我正在编写一个代码,使用

pandas.read_csv
读取 CSV 文件,问题在于编码,我使用的是
utf-8-sig
编码,并且这是有效的。但是,这给我带来了其他 CSV 文件的错误。我发现有些文件需要其他类型的编码,例如
cp1252
。问题是我无法将用户限制为与我的编码匹配的特定 CSV 类型。 那么有没有办法解决这个问题呢?例如,是否有适用于所有 CSV 的通用编码类型?或者我可以传递所有可能的编码器的数组吗?

python pandas csv encoding encode
3个回答
2
投票

CSV 文件是文本文件。如果它只包含 ASCII 字符,那么现在没有问题,大多数编码都可以正确处理纯 ASCII 字符。非 ASCII 字符会出现问题。例子

性格 拉丁1代码 cp850代码 UTF-8 代码
é
'\xe9'
'\x82'
'\xc3\xa9'
è
'\xe8'
'\x8a'
'\xc3\xa8'
ö
'\xf6'
'\x94'
'\xc3\xb6'

情况更糟,因为单字节字符集最多可以表示 256 个字符,而 UTF-8 可以表示所有字符。例如,除了 normal 引号字符

'
之外,unicode 还包含其左
或右
版本,它们都没有以 Latin1 或 CP850 表示。

长话短说,没有什么比通用编码更好的了。但某些编码(例如 Latin1)具有特殊性:它们可以解码任何字节。因此,如果您声明 Latin1 编码,则不会引发 UnicodeDecodeError。简而言之,如果文件是 UTF-8 编码的,则

é
将看起来像
é
。正确的单引号是
'â\x80\x99'
,但在 Latin1 系统上显示为
â
,在 cp1252 系统上显示为
’

正如您所说的 CP1252,它是 Latin1 的 Windows 变体,但它不具有能够解码任何字节的属性。

常见的方法是要求向您发送 CSV 文件的人使用相同的编码,并尝试使用该编码进行解码。对于编码错误的文件,您有两种解决方法。第一个是 CygnusX 提出的:尝试一系列以 Latin1 结尾的编码,例如

encodings = ["utf-8-sig", "utf-8", "cp1252", "latin1"]
(顺便说一句,Latin1 是 ISO-8859-1 的别名,因此无需同时测试两者)。

第二个是使用

errors='replace'
打开文件:任何有问题的字节都将被替换字符替换。至少所有 ASCII 字符都是正确的:

with open(filename, encoding='utf-8-sig', errors='replace') as file:
    fd = pd.read_csv(file, other_parameters...)

1
投票

你可以尝试这个:https://stackoverflow.com/a/48556203/11246056

或者在 try/ except 语句中迭代多种格式:

encodings = ["utf-8-sig", "cp1252", "iso-8859-1", "latin1"]
try:
    for encoding in encodings:
        pandas.read_csv(..., encoding=encoding, ...)
        ...
except ValueError:  # or the error you receive
    continue

0
投票

这里有一个类似的解决方案,循环不同类型的编码。一旦使用了有效的编码,就退出循环并继续!

encodings = ["utf-8","utf-8-sig", "iso-8859-1", "latin1", "cp1252"]
for encoding in encodings:
    try:
        dataframe = pd.read_csv(input_data_path,encoding=encoding)
        break
    except Exception as e:  # or the error you receive
        pass
© www.soinside.com 2019 - 2024. All rights reserved.