Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python读取Pandas中的CSV文件时出现UnicodeDecodeError_Python_Pandas_Csv_Dataframe_Unicode - Fatal编程技术网

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

使用Python读取Pandas中的CSV文件时出现UnicodeDecodeError,python,pandas,csv,dataframe,unicode,Python,Pandas,Csv,Dataframe,Unicode,我正在运行一个程序,它正在处理30000个类似的文件。它们中的随机数正在停止并产生此错误 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

我正在运行一个程序,它正在处理30000个类似的文件。它们中的随机数正在停止并产生此错误

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\u csv
使用
编码
选项来处理不同格式的文件。我通常使用
read\u csv('file',encoding=“ISO-8859-1”)
,或者使用
encoding=“utf-8”
进行读取,通常使用
utf-8
进行
到\u csv

您还可以使用几个
别名
选项中的一个,如
'latin'
,而不是
'ISO-8859-1'
(另请参阅,了解您可能遇到的许多其他编码)

看,, ,还有很多相关的问题。一个好的背景资源是


要检测编码(假设文件包含非ascii字符),可以使用
enca
(请参阅)或
file-i
(linux)或
file-i
(请参阅)

最简单的解决方案:

import pandas as pd
df = pd.read_csv('file_name.csv', engine='python')
替代解决方案:

  • 在升华文本编辑器或VS代码中打开csv文件
  • 以utf-8格式保存文件
在sublime中,单击文件->使用编码保存->UTF-8

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

import pandas as pd
data = pd.read_csv('file_name.csv', encoding='utf-8')
其他不同的编码类型有:

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

为此挣扎了一会儿,我想我会发布这个问题,因为这是第一个搜索结果。将
encoding=“iso-8859-1”
标记添加到pandas
read\u csv
中不起作用,任何其他编码也不起作用,导致出现UnicodeDecodeError


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

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

  • 您知道编码,并且文件中没有编码错误。 很好:您只需指定编码:

    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字符):

  • 您知道大多数文件都是用特定的编码编写的,但它也包含编码错误。一个真实的例子是一个UTF8文件,该文件已使用非UTF8编辑器进行编辑,其中包含一些编码不同的行。Pandas没有提供特殊的错误处理,但是Python
    open
    函数有(假设是Python3),并且
    read\u csv
    接受类似文件的对象。这里要使用的典型错误参数是
    'ignore'
    ,它只会抑制有问题的字节,或者(IMHO更好)
    'backslashplace'
    ,它用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, ...)
    
  • 执行此代码后,您将找到“filename.csv”的编码,然后执行以下代码

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

    好了

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

    >>> f = open(filename,"r")
    >>> reader = DictReader(f)
    >>> next(reader)
    OrderedDict([('\ufeffid', '1'), ... ])
    
    然后在CSV文件的开头有一个字节顺序标记(BOM)字符。这个答案解决了这个问题:

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


    希望这对某人有所帮助。

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


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

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


    希望这对其他人有所帮助。

    尝试指定引擎class='python'。 这对我来说很有效,但我仍在试图找出原因

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

    我用的是Jupyter笔记本。在我的例子中,它以错误的格式显示文件。“编码”选项不起作用。
    因此,我将csv保存为utf-8格式,它可以正常工作。

    在我的例子中,这适用于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) 
    
    试试这个:

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

    看起来它会处理编码,而不会通过参数显式表示它

    在传递给pandas之前检查编码。这会让你慢下来,但是

    with open(path, 'r') as f:
        encoding = f.encoding 
    
    df = pd.read_csv(path,sep=sep, encoding=encoding)
    

    在Python3.7中,我发布了一个答案,以提供更新的解决方案,并解释为什么会出现此问题。假设您从数据库或Excel工作簿获取此数据。如果您有特殊字符,如
    La Cañada Flintridge city
    ,那么除非您使用
    UTF-8
    编码导出数据,否则将引入错误
    La Cañada Flintridge city
    将成为
    La Ca\xf1 ada 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'
    。默认情况下,熊猫使用
    engine='C'
    whic
    import pandas as pd
    with open('filename.csv') as f:
        data = pd.read_csv(f)
    
    with open(path, 'r') as f:
        encoding = f.encoding 
    
    df = pd.read_csv(path,sep=sep, encoding=encoding)
    
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf1 in position 5: invalid continuation byte
    
    pd.read_csv(<your file>, engine='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)
    
    _values = pd.read_csv("C:\Users\Mujeeb\Desktop\file.xlxs")
    
    encoding='unicode_escape'
    
    import csv
    import pandas as pd
    df = pd.read_csv(filepath,encoding='unicode_escape')
    
    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 
    
    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())