为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

汪汪一只猫 2019-07-22 10:49:21

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

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

   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

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


查看完整描述

3 回答

?
明月笑刀无情

read_csv采取encoding处理不同格式的文件的选项。我主要用read_csv('file', encoding = "ISO-8859-1"),或者另一种encoding = "utf-8"用于阅读,以及一般情况下utf-8to_csv.

您还可以使用以下几种方法中的一种alias像这样的选项'latin'而不是'ISO-8859-1'(见Python文档,也适用于您可能遇到的许多其他编码)。

看见相关PADAS文件Python文档中CSV文件的示例,还有很多相关的问题。一个好的背景资源是每个开发人员都应该了解unicode和字符集。.

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


查看完整回答
反对 回复 2019-07-22
?
侃侃尔雅

最简单的解决方案:

  • 打开CSV文件

    崇高文本编辑器.

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

在崇高中,单击文件->用编码保存->UTF-8

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

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

编辑1:

如果有许多文件,那么您可以跳过崇高的步骤。

只需使用

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

其他不同的编码类型是:

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


查看完整回答
反对 回复 2019-07-22
?
阿波罗的战车

熊猫允许指定编码,但不允许忽略错误,不允许自动替换违规字节。所以没有一刀切方法,但方法不同,取决于实际用例。

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

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

    pd.read_csv(input_file_and_path, ..., encoding='latin1')
  3. 您知道,大多数文件都是用特定的编码编写的,但它也包含编码错误。一个真实的例子是使用非UTF 8编辑器编辑的UTF 8文件,其中包含了一些编码不同的行。熊猫没有特殊的错误处理,但是Python。open函数具有(假设Python 3),以及read_csv接受类似对象的文件。这里使用的典型错误参数是'ignore'它只会抑制违规的字节或(IMHO更好)'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, ...)


查看完整回答
反对 回复 2019-07-22

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信