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

2024-12-03 08:44:00
admin
原创
311
摘要:问题描述:我正在运行一个程序,该程序正在处理 30,000 个类似文件。其中随机有一部分文件停止运行并产生此错误... File "C:Importersrcdfmanimporter.py", line 26, in import_chr data = pd.read_csv(...

问题描述:

我正在运行一个程序,该程序正在处理 30,000 个类似文件。其中随机有一部分文件停止运行并产生此错误...

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

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


解决方案 1:

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文档,也了解您可能遇到的许多其他编码)。

请参阅相关的 Pandas 文档、
csv 文件的 Python 文档示例以及 SO 上的大量相关问题。一个很好的背景资源是每个开发人员都应该了解的 unicode 和字符集。

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

解决方案 2:

最简单的解决方案:

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

替代解决方案:

崇高的文本:

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

  • 以 utf-8 格式保存文件。

  • 在 sublime 中,单击文件 -> 使用编码保存 -> UTF-8

VS 代码:

在 VSCode 的底部栏中,您将看到标签 UTF-8。单击它。将打开一个弹出窗口。单击使用编码保存。您现在可以为该文件选择一种新编码。

然后,您可以照常读取文件:

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

其他不同的编码类型包括:

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

解决方案 3:

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

  1. 您知道编码,并且文件中没有编码错误。太好了:您只需指定编码:

file_encoding = 'cp1252'        # set file_encoding to the file encoding (utf8, latin1, etc.)
pd.read_csv(input_file_and_path, ..., encoding=file_encoding)
  1. 您不想被编码问题所困扰,只想加载该死的文件,无论某些文本字段是否包含垃圾。好的,您只需使用Latin1编码,因为它接受任何可能的字节作为输入(并将其转换为相同代码的 unicode 字符):

pd.read_csv(input_file_and_path, ..., encoding='latin1')
  1. 您知道文件的大部分内容都是用特定编码编写的,但它也包含编码错误。一个真实的例子是一个使用非 utf8 编辑器编辑的 UTF8 文件,其中包含一些具有不同编码的行。Pandas 没有提供特殊的错误处理,但 Pythonopen函数有(假设是 Python3),并read_csv接受类似文件的对象。这里使用的典型错误参数是'ignore'仅抑制有问题的字节或(在我看来更好)'backslashreplace'用 Python 的反斜杠转义序列替换有问题的字节:

file_encoding = 'utf8'        # set file_encoding to the file encoding (utf8, latin1, etc.)
input_fd = open(input_file_and_path, encoding=file_encoding, errors = 'backslashreplace')
pd.read_csv(input_fd, ...)

解决方案 4:

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

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, ':
', df.head())

首先从 Python 版本可用的所有标准编码开始(在本例中为 3.7 Python 3.7 标准编码)。此处提供了不同 Python 版本的标准编码的可用 Python 列表:有用的 Stack overflow 答案

在一小部分数据上尝试每种编码;仅打印有效的编码。输出一目了然。此输出还解决了这样一个问题:像“latin1”这样的编码虽然没有任何错误,但并不一定能产生想要的结果。

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

解决方案 5:

请尝试添加

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

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

您可以先加载 1000 行,以快速加载文件。

解决方案 6:

with open('filename.csv') as f:
   print(f)

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

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

你去吧

解决方案 7:

尝试更改编码。就我而言,encoding = "utf-16"成功了。

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

解决方案 8:

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

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)

解决方案 9:

USC-2 LE BOM在我的例子中,根据 Notepad++,文件有编码。它encoding="utf_16_le"适用于 Python。

希望它能帮助某人更快地找到答案。

解决方案 10:

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

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

解决方案 11:

就我而言,这适用于 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) 

解决方案 12:

纠结了好久,觉得应该发帖讨论这个问题,因为这是第一个搜索结果。将标签添加encoding="iso-8859-1"到 pandasread_csv不起作用,其他编码也不起作用,一直出现 UnicodeDecodeError。

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

解决方案 13:

我遇到的另一个导致同样错误的重要问题是:

_values = pd.read_csv("C:UsersMujeebDesktopile.xlxs")

^此行导致相同的错误,因为我正在使用read_csv()方法读取 excel 文件。用于read_excel()读取 .xlxs

解决方案 14:

只需将编码添加到您的方法中,如下所示:

import pandas as pd

df = pd.read_csv('sales_data_sample.csv', encoding = "ISO-8859-1")

print(df)

解决方案 15:

我发布答案是为了提供更新的解决方案并解释为什么会出现此问题。假设您从数据库或 Excel 工作簿中获取此数据。如果您有特殊字符La Cañada Flintridge city,例如,除非您使用编码导出数据UTF-8,否则您将引入错误。La Cañada Flintridge city将变成La Caxf1ada 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('
', '').split(',')
    # read the rest of the data
    for line in myfile:
        row = line.decode('utf-8', errors='ignore').replace('
', '').split(',')
        data.append(row)

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

希望这对第一次遇到此问题的人有所帮助。

解决方案 16:

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

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

解决方案 17:

你可以尝试一下。

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

解决方案 18:

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

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

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

Python 读取 csv-BOM 嵌入到第一个键中

解决方案是使用以下命令加载 CSV encoding="utf-8-sig"

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

希望这对某人有帮助。

解决方案 19:

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

希望这对某人有帮助。

解决方案 20:

我正在使用 Jupyter-notebook。就我而言,它显示的文件格式错误。“编码”选项不起作用。因此,我将 csv 保存为 utf-8 格式,这样就可以了。

解决方案 21:

尝试一下:

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

看起来它将处理编码,而无需通过参数明确表达它

解决方案 22:

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

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

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

在 Python 3.7 中

解决方案 23:

有时问题只出在 .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 

解决方案 24:

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

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

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

一切似乎都进展顺利。

解决方案 25:

再来一张收据

   import csv
   import chardet
   import pandas

   # io_bytes: BytesIO  <=> input data 

   byte_line: bytes = io_bytes.readline()
   dialect = csv.Sniffer().sniff(str(byte_line))
   encoding_info = chardet.detect(byte_line)
   io_bytes.seek(0)
   dataframe = pandas.read_csv(
       io_bytes, 
       delimiter=dialect.delimiter, 
       encoding=encoding_info["encoding"],
   )

解决方案 26:

您可以尝试:

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

解决方案 27:

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

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用