我正在运行一个程序,它正在处理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

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


当前回答

你可以试试:

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

其他回答

在传递给熊猫之前检查编码。它会让你慢下来,但是……

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

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

在python 3.7中

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

你也可以使用一些别名选项,如'latin'或'cp1252' (Windows),而不是'ISO-8859-1'(参见python文档,也可以了解您可能遇到的许多其他编码)。

参见相关熊猫文件, 关于csv文件的python文档示例,以及大量关于SO的相关问题。一个很好的背景资源是每个开发人员都应该知道unicode和字符集。

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

你可以试试:

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

你总是可以尝试先检测文件的编码,使用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)

最简单的解决方案:

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

VS代码:

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

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

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

其他不同的编码类型有:

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