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

UnicodeDecodeError when reading CSV file in Pandas with Python

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
   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

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


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

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

查看相关的Pandas文档,
关于csv文件的python docs示例,以及关于SO的大量相关问题。一个好的后台资源是每个开发人员应该了解的unicode和字符集。

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


最简单的解决方案:

  • 在Sublime文本编辑器中打开csv文件。
  • 以utf-8格式保存文件。

In sublime, Click File -> Save with encoding -> UTF-8

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

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

编辑1:

如果有很多文件,那么您可以跳过sublime步骤。

只需阅读文件即可

1
data = pd.read_csv('file_name.csv', encoding='utf-8')

和其他不同的编码类型是:

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


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

  • 您知道编码,并且文件中没有编码错误。
    太棒了:你只需要指定编码:

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

    1
    pd.read_csv(input_file_and_path, ..., encoding='latin1')
  • 您知道大多数文件都是使用特定编码编写的,但它也包含编码错误。一个真实世界的例子是一个UTF8文件,该文件是用非utf8编辑器编辑的,其中包含一些具有不同编码的行。 Pandas没有提供特殊的错误处理,但是Python open函数有(假设是Python3),而read_csv接受像object这样的文件。这里使用的典型错误参数是'ignore',它只是抑制有问题的字节或(恕我直通更好)'backslashreplace',它用Python的反斜杠转义序列替换有问题的字节:

    1
    2
    3
    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, ...)

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

    执行此代码后,您将找到'filename.csv'的编码,然后执行如下代码

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

    你去吧


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

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


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

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


    在我的情况下,这适用于python 2.7:

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

    而对于python 3,只有:

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

    这个答案似乎是CSV编码问题的全部。如果你的标题有一个奇怪的编码问题,如下所示:

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

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

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

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

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

    希望这有助于某人。


    挣扎了一段时间,并认为我会发布这个问题,因为这是第一个搜索结果。将encoding ='iso-8859-1"标签添加到pandas read_csv不起作用,也没有任何其他编码,继续给出UnicodeDecodeError。

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


    我正在使用Jupyter-notebook。 在我的情况下,它以错误的格式显示文件。 'encoding'选项不起作用。
    所以我用utf-8格式保存csv,它的工作原理。


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

    希望这有助于某人。