ChatGPT解决这个技术问题 Extra ChatGPT

使用 Python 在 Pandas 中读取 CSV 文件时出现 UnicodeDecodeError

我正在运行一个正在处理 30,000 个类似文件的程序。他们中的一个随机数正在停止并产生这个错误......

File "C:\Importer\src\dfman\importer.py", line 26, in import_chr
     data = pd.read_csv(filepath, names=fields)
File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 400, in parser_f
     return _read(filepath_or_buffer, kwds)
File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 205, in _read
     return parser.read()
   File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 608, in read
     ret = self._engine.read(nrows)
File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 1028, in read
     data = self._reader.read(nrows)
File "parser.pyx", line 706, in pandas.parser.TextReader.read (pandas\parser.c:6745)
File "parser.pyx", line 728, in pandas.parser.TextReader._read_low_memory (pandas\parser.c:6964)
File "parser.pyx", line 804, in pandas.parser.TextReader._read_rows (pandas\parser.c:7780)
File "parser.pyx", line 890, in pandas.parser.TextReader._convert_column_data (pandas\parser.c:8793)
File "parser.pyx", line 950, in pandas.parser.TextReader._convert_tokens (pandas\parser.c:9484)
File "parser.pyx", line 1026, in pandas.parser.TextReader._convert_with_dtype (pandas\parser.c:10642)
File "parser.pyx", line 1046, in pandas.parser.TextReader._string_convert (pandas\parser.c:10853)
File "parser.pyx", line 1278, in pandas.parser._string_box_utf8 (pandas\parser.c:15657)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xda in position 6: invalid    continuation byte

这些文件的来源/创建都来自同一个地方。纠正此问题以继续导入的最佳方法是什么?

添加此参数对我有用:encoding_errors='ignore'
忽略错误应该是你最后的绝望手段。同样,随机猜测使用哪种编码可能会从表面上消除错误,但会在结果中产生完全的垃圾。如果您不熟悉文本编码,不妨使用 Stack Overflow character-encoding tag info page 开始您的下一次冒险

S
Stefan

read_csv 采用 encoding 选项来处理不同格式的文件。我主要使用 read_csv('file', encoding = "ISO-8859-1"),或者 encoding = "utf-8" 用于阅读,通常 utf-8 用于 to_csv

您还可以使用多个 alias 选项之一,例如 'latin''cp1252' (Windows),而不是 'ISO-8859-1'(请参阅 python docs,还可以了解您可能遇到的许多其他编码)。

请参阅此处的 relevant Pandas documentationpython docs examples on csv files 和大量有关 SO 的相关问题。一个好的背景资源是 What every developer should know about unicode and character sets

要检测编码(假设文件包含非 ascii 字符),您可以使用 enca(参见 man page)或 file -i (linux) 或 file -I (osx)(参见 man page)。


由于这是一个 Windows 问题,cp1252 可能优于 iso-8859-1
谢谢pd.read_csv('immigration.csv', encoding = "ISO-8859-1", engine='python')为我工作
不要仅仅因为没有抛出异常就盲目地假设某种编码是正确的。您需要查看字符串并确定解释是否有意义。例如,如果您得到“hors d'½uvre”而不是“hors d'œuvre”,您可能需要从 ISO-8859-1 切换到 ISO-8859-15。
对我来说编码是 ANSI。为了弄清楚,我在 notepad 中打开了 csv,然后单击 save as,它在保存按钮旁边显示了编码。
G
Gil Baggio

最简单的解决方案:

import pandas as pd
df = pd.read_csv('file_name.csv', engine='python')

替代解决方案:

在 Sublime 文本编辑器或 VS Code 中打开 csv 文件。

以 utf-8 格式保存文件。

在 sublime 中,点击 File -> Save with encoding -> UTF-8

然后,您可以像往常一样读取文件:

import pandas as pd
data = pd.read_csv('file_name.csv', encoding='utf-8')

其他不同的编码类型是:

encoding = "cp1252"
encoding = "ISO-8859-1"

该问题解释说有 30,000 个这样的文件。手动打开每个文件是不切实际的。
至少对于一个文件,这似乎对我有用!
C 引擎显然更宽容地接受它。对于使用 encoding='iso-8859-1' 可以正常打开的特定 CSV 文件,使用 engine='python' 会引发 _csv.Error: field larger than field limit (131072)
使用 save 和编码的替代解决方案真的很有帮助!这是 VSCode 的使用方法stackoverflow.com/questions/30082741/…
感谢您的提示,通过 VS Code 保存 CSV 文件对我有用。
S
Serge Ballesta

Pandas 允许指定编码,但不允许忽略错误以自动替换有问题的字节。因此,没有一种适合所有方法的方法,而是根据实际用例采用不同的方法。

你知道编码,文件中没有编码错误。太好了:您只需指定编码: file_encoding = 'cp1252' # 将 file_encoding 设置为文件编码(utf8、latin1 等) pd.read_csv(input_file_and_path, ..., encoding=file_encoding) 你不想成为被编码问题困扰,只想加载那个该死的文件,不管某些文本字段是否包含垃圾。好的,您只需要使用 Latin1 编码,因为它接受任何可能的字节作为输入(并将其转换为相同代码的 unicode 字符): pd.read_csv(input_file_and_path, ..., encoding='latin1') 你知道大多数的文件是用特定的编码写入的,但它也包含编码错误。一个真实的例子是一个 UTF8 文件,该文件已使用非 utf8 编辑器进行编辑,其中包含一些具有不同编码的行。 Pandas 没有提供特殊的错误处理,但 Python 的 open 函数有(假设 Python3),并且 read_csv 接受像 object 之类的文件。此处使用的典型错误参数是 'ignore',它只是抑制有问题的字节或(恕我直言)'backslashreplace',它用 Python 的反斜杠转义序列替换有问题的字节: file_encoding = 'utf8' # 将 file_encoding 设置为文件编码(utf8 , latin1, etc.) input_fd = open(input_file_and_path, encoding=file_encoding, errors = 'backslashreplace') pd.read_csv(input_fd, ...)


迟到的答案,但针对 duplicate question...
b
bhavesh
with open('filename.csv') as f:
   print(f)

执行此代码后,您将找到“filename.csv”的编码,然后执行以下代码

data=pd.read_csv('filename.csv', encoding="encoding as you found earlier"

你去吧


这天真地假设 Python 可以正确地预测 Pandas 无法正确预测的编码。
F
Fledias weh

对于所述问题,这是一种更通用的脚本方法。

import pandas as pd

encoding_list = ['ascii', 'big5', 'big5hkscs', 'cp037', 'cp273', 'cp424', 'cp437', 'cp500', 'cp720', 'cp737'
                 , 'cp775', 'cp850', 'cp852', 'cp855', 'cp856', 'cp857', 'cp858', 'cp860', 'cp861', 'cp862'
                 , 'cp863', 'cp864', 'cp865', 'cp866', 'cp869', 'cp874', 'cp875', 'cp932', 'cp949', 'cp950'
                 , 'cp1006', 'cp1026', 'cp1125', 'cp1140', 'cp1250', 'cp1251', 'cp1252', 'cp1253', 'cp1254'
                 , 'cp1255', 'cp1256', 'cp1257', 'cp1258', 'euc_jp', 'euc_jis_2004', 'euc_jisx0213', 'euc_kr'
                 , 'gb2312', 'gbk', 'gb18030', 'hz', 'iso2022_jp', 'iso2022_jp_1', 'iso2022_jp_2'
                 , 'iso2022_jp_2004', 'iso2022_jp_3', 'iso2022_jp_ext', 'iso2022_kr', 'latin_1', 'iso8859_2'
                 , 'iso8859_3', 'iso8859_4', 'iso8859_5', 'iso8859_6', 'iso8859_7', 'iso8859_8', 'iso8859_9'
                 , 'iso8859_10', 'iso8859_11', 'iso8859_13', 'iso8859_14', 'iso8859_15', 'iso8859_16', 'johab'
                 , 'koi8_r', 'koi8_t', 'koi8_u', 'kz1048', 'mac_cyrillic', 'mac_greek', 'mac_iceland', 'mac_latin2'
                 , 'mac_roman', 'mac_turkish', 'ptcp154', 'shift_jis', 'shift_jis_2004', 'shift_jisx0213', 'utf_32'
                 , 'utf_32_be', 'utf_32_le', 'utf_16', 'utf_16_be', 'utf_16_le', 'utf_7', 'utf_8', 'utf_8_sig']

for encoding in encoding_list:
    worked = True
    try:
        df = pd.read_csv(path, encoding=encoding, nrows=5)
    except:
        worked = False
    if worked:
        print(encoding, ':\n', df.head())

一开始是所有可用于 python 版本的标准编码(在本例中为 3.7 python 3.7 standard encodings)。此处提供了不同 python 版本的标准编码的可用 python 列表:Helpful Stack overflow answer

在一小块数据上尝试每种编码;只打印工作编码。输出直接明显。此输出还解决了这样的问题:像“latin1”这样的编码可能会出现任何错误,但不一定会产生想要的结果。

如果遇到问题,我会尝试针对有问题的 CSV 文件使用这种方法,然后可能会尝试将找到的工作编码用于所有其他文件。


您应该将 ISO-8859 移到列表的末尾,因为它在任何情况下都会成功。
P
Prakhar Rathi

请尝试添加

import pandas as pd
df = pd.read_csv('file.csv', encoding='unicode_escape')

这会有所帮助。为我工作。此外,请确保您使用了正确的分隔符和列名。

您可以从仅加载 1000 行开始快速加载文件。


这个对我有用。我的 csv 文件包含带双引号的字段
a
ah bon

尝试更改编码。就我而言,encoding = "utf-16" 有效。

df = pd.read_csv("file.csv",encoding='utf-16')


with open (file) as f: encoding = f.encoding 为我正在使用的文件返回了 cp1252。但是,指定 encoding = 'utf-16' 是为我打开文件而没有任何错误。另外,我设置了 engine = 'python'。谢谢你的建议。
utf-16 为我工作!以上所有情况 - 没有(
U
UserAG

就我而言,根据 Notepad++,文件具有 USC-2 LE BOM 编码。对于 python,它是 encoding="utf_16_le"

希望,它有助于更快地为某人找到答案。


J
Jan33

尝试指定 engine='python'。它对我有用,但我仍在试图找出原因。

df = pd.read_csv(input_file_path,...engine='python')

这也对我有用。编码=“ISO-8859-1”也是如此。这绝对是一个编码问题。如果一个特殊字符用 ANSI 编码,例如一个椭圆字符(即“...”),而你尝试用 UTF-8 读取它,你可能会得到一个错误。底线是您必须知道创建文件的编码。
“以 ANSI 编码”没有明确定义。 Windows 上的 ANSI 术语是用词不当,并且没有命名任何特定的编码;相反,它选择系统设置中其他地方定义的编码。
V
Victor Villacorta

就我而言,这适用于 python 2.7:

data = read_csv(filename, encoding = "ISO-8859-1", dtype={'name_of_colum': unicode}, low_memory=False) 

而对于 python 3,只有:

data = read_csv(filename, encoding = "ISO-8859-1", low_memory=False) 

D
Dileep Dominic

你可以试试这个。

import csv
import pandas as pd
df = pd.read_csv(filepath,encoding='unicode_escape')

T
Tshilidzi Mudau

挣扎了一段时间,并认为我会在这个问题上发布,因为它是第一个搜索结果。将 encoding="iso-8859-1" 标记添加到 pandas read_csv 无效,任何其他编码也无效,不断给出 UnicodeDecodeError。

如果您将文件句柄传递给 pd.read_csv(),,则需要将 encoding 属性放在打开的文件上,而不是放在 read_csv 中。事后看来很明显,但要追查是一个微妙的错误。


U
UserAG

我发布了一个答案,以提供更新的解决方案并解释为什么会出现此问题。假设您从数据库或 Excel 工作簿中获取此数据。如果您有像 La Cañada Flintridge city 这样的特殊字符,那么除非您使用 UTF-8 编码导出数据,否则您将引入错误。 La Cañada Flintridge city 将变为 La Ca\xf1ada Flintridge city。如果您使用 pandas.read_csv 而不对默认参数进行任何调整,您将遇到以下错误

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf1 in position 5: invalid continuation byte

幸运的是,有一些解决方案。

选项 1,修复导出。请务必使用 UTF-8 编码。

选项 2,如果您无法解决导出问题,而您需要使用 pandas.read_csv,请务必包含以下参数,engine='python'。默认情况下,pandas 使用 engine='C' 非常适合读取大型干净文件,但如果出现任何意外情况会崩溃。根据我的经验,设置 encoding='utf-8' 从未修复此 UnicodeDecodeError。此外,您不需要使用 errors_bad_lines,但是,如果您真的需要它,这仍然是一个选项。

pd.read_csv(<your file>, engine='python')

选项3:解决方案是我个人的首选解决方案。使用 vanilla Python 读取文件。

import pandas as pd

data = []

with open(<your file>, "rb") as myfile:
    # read the header seperately
    # decode it as 'utf-8', remove any special characters, and split it on the comma (or deliminator)
    header = myfile.readline().decode('utf-8').replace('\r\n', '').split(',')
    # read the rest of the data
    for line in myfile:
        row = line.decode('utf-8', errors='ignore').replace('\r\n', '').split(',')
        data.append(row)

# save the data as a dataframe
df = pd.DataFrame(data=data, columns = header)

希望这可以帮助人们第一次遇到这个问题。


在这种情况下,正确的解决方案是建立正确的编码。基于单个字符,很难说权威,但0xF1对应于例如Latin-1中的ñtripleee.github.io/8bit/#f1 列出了此字节在 Python 支持的所有 8 位编码中表示的字符。如果您关心数据的完整性,errors="ignore" 是一个非常糟糕的主意。
@tripleee 好点,但这是一个并不总是可用的解决方案。有时,您会得到一个数据集,对它的导出方式有很大的发言权
我不明白你的评论是如何相关的。如果您可以自己以已知编码导出文件,那么您当然不需要弄清楚编码。如果给你一个编码未知的文件,找出它的编码比盲目猜测或粗暴地删除任何不是 UTF-8 的数据要好得多。这仍然假设文件没有损坏或其他东西,在这种情况下,除了找出正确的编码之外,您还需要手动查找并修复损坏。
L
Luk Aron

我在打开从网上银行下载的简体中文 CSV 文件时遇到问题,我试过 latin1,我试过 iso-8859-1,我试过 cp1252,都无济于事。

但是 pd.read_csv("",encoding ='gbk') 只是完成了这项工作。


您尝试的所有编码都不支持表示中文文本。 GBK 在中国仍然比较流行,它是一个国家标准,但在其他任何地方都很少使用。另请参阅en.wikipedia.org/wiki/GBK_(character_encoding)
C
Community

我面临的另一个导致相同错误的重要问题是:

_values = pd.read_csv("C:\Users\Mujeeb\Desktop\file.xlxs")

^这一行导致了同样的错误,因为我正在使用 read_csv() 方法读取一个 excel 文件。使用 read_excel() 读取 .xlxs


哇,其他人都在谈论编码问题。看来我的问题很奇怪。
n
nbwoodward

这个答案似乎是 CSV 编码问题的全部。如果您的标头出现奇怪的编码问题,如下所示:

>>> f = open(filename,"r")
>>> reader = DictReader(f)
>>> next(reader)
OrderedDict([('\ufeffid', '1'), ... ])

然后在 CSV 文件的开头有一个字节顺序标记 (BOM) 字符。这个答案解决了这个问题:

Python read csv - BOM embedded into the first key

解决方案是使用 encoding="utf-8-sig" 加载 CSV:

>>> f = open(filename,"r", encoding="utf-8-sig")
>>> reader = DictReader(f)
>>> next(reader)
OrderedDict([('id', '1'), ... ])

希望这可以帮助某人。


N
Nisse Engström

我正在发布这个旧线程的更新。我找到了一种可行的解决方案,但需要打开每个文件。我在 LibreOffice 中打开了我的 csv 文件,选择了另存为 >编辑过滤器设置。在下拉菜单中,我选择了 UTF8 编码。然后我将 encoding="utf-8-sig" 添加到 data = pd.read_csv(r'C:\fullpathtofile\filename.csv', sep = ',', encoding="utf-8-sig")

希望这可以帮助某人。


Nisse,感谢您的编辑。你能解释一下你改变了什么吗?我看不出有什么不同。
我不是 Nisse,但他在“希望这有帮助”结尾之前添加了句号和换行符。
m
mikey

您始终可以尝试先使用 chardet 或 cchardet 检测文件的编码:

from pathlib import Path
import chardet

filename = "file_name.csv"
detected = chardet.detect(Path(filename).read_bytes())
# detected is something like {'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}

encoding = detected.get("encoding")
assert encoding, "Unable to detect encoding, is it a binary file?"

df = pd.read_csv(filename, encoding=encoding)


这帮助我摆脱了假设我的 json 文件是 utf-8 的棘手情况,但事实证明它一直是 utf-16。感谢分享!
H
Himanshu Sharma

我正在使用 Jupyter 笔记本。就我而言,它以错误的格式显示文件。 “编码”选项不起作用。所以我将 csv 保存为 utf-8 格式,它可以工作。


D
DaveP

在传递给 pandas 之前检查编码。它会减慢你的速度,但是...

with open(path, 'r') as f:
    encoding = f.encoding 

df = pd.read_csv(path,sep=sep, encoding=encoding)

在蟒蛇 3.7


如果 Python 无法预测编码,这只会提前失败。在非 Windows 平台上的现代 Python 3 上,这将默认为 UTF-8,如果文件不兼容,则会失败。在 Windows 上,这将默认为系统配置的默认值,所以如果你幸运的话它可能会工作,或者如果你不那么幸运,它会产生垃圾。
K
Ke Xu

尝试这个:

import pandas as pd
with open('filename.csv') as f:
    data = pd.read_csv(f)

看起来它会处理编码而不通过参数明确表达它


a
ah bon

您可以尝试:

df = pd.read_csv('./file_name.csv', encoding='gbk')


O
Om Rastogi

有时问题仅出在 .csv 文件上。该文件可能已损坏。遇到这个问题的时候。再次将文件“另存为”为 csv。

0. Open the xls/csv file
1. Go to -> files 
2. Click -> Save As 
3. Write the file name 
4. Choose 'file type' as -> CSV [very important]
5. Click -> Ok 

不确定您在这里使用哪个程序。 Excel?
打开excel文件
这假设 CSV 是从 Excel 文件生成的,但显然通常情况并非如此(如果是,也许您应该认真检查您的工具选择)。
您是对的,但无论用于创建 CSV 文件的工具如何,MS excel 都支持打开 CSV 文件,因此您可以使用它。此外,大多数情况下 CSV 文件仅由 excel 工具生成。如果这不起作用,您可以尝试使用其他一些源工具。
R
Reza Rahimi

Pandas 不会通过更改编码样式来自动替换有问题的字节。就我而言,将编码参数从 encoding = "utf-8" 更改为 encoding = "utf-16" 解决了这个问题。


O
Onur Kirman

就我而言,我无法使用之前提供的任何方法来克服这个问题。将编码器类型更改为 utf-8utf-16iso-8859-1 或任何其他类型都不起作用。

但我没有使用 pd.read_csv(filename, delimiter=';'),而是使用了;

pd.read_csv(open(filename, 'r'), delimiter=';')

一切似乎都很好。


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅