在 pandas 中读取 csv 文件时出错 [CParserError: 标记数据时出错。 C 错误:捕获缓冲区溢出 - 可能是格式错误的输入文件。]

Posted

技术标签:

【中文标题】在 pandas 中读取 csv 文件时出错 [CParserError: 标记数据时出错。 C 错误:捕获缓冲区溢出 - 可能是格式错误的输入文件。]【英文标题】:Error in Reading a csv file in pandas[CParserError: Error tokenizing data. C error: Buffer overflow caught - possible malformed input file.] 【发布时间】:2016-03-04 02:19:42 【问题描述】:

所以我尝试从一个文件夹中读取所有 csv 文件,然后将它们连接起来创建一个大 csv(所有文件的结构相同),保存并再次读取。所有这些都是使用 Pandas 完成的。读取时发生错误。我在下面附上代码和错误。

import pandas as pd
import numpy as np
import glob

path =r'somePath' # use your path
allFiles = glob.glob(path + "/*.csv")
frame = pd.DataFrame()
list_ = []
for file_ in allFiles:
    df = pd.read_csv(file_,index_col=None, header=0)
    list_.append(df)
store = pd.concat(list_)
store.to_csv("C:\work\DATA\Raw_data\\store.csv", sep=',', index= False)
store1 = pd.read_csv("C:\work\DATA\Raw_data\\store.csv", sep=',')

错误:-

CParserError                              Traceback (most recent call last)
<ipython-input-48-2983d97ccca6> in <module>()
----> 1 store1 = pd.read_csv("C:\work\DATA\Raw_data\\store.csv", sep=',')

C:\Users\armsharm\AppData\Local\Continuum\Anaconda\lib\site-packages\pandas\io\parsers.pyc in parser_f(filepath_or_buffer, sep, dialect, compression, doublequote, escapechar, quotechar, quoting, skipinitialspace, lineterminator, header, index_col, names, prefix, skiprows, skipfooter, skip_footer, na_values, na_fvalues, true_values, false_values, delimiter, converters, dtype, usecols, engine, delim_whitespace, as_recarray, na_filter, compact_ints, use_unsigned, low_memory, buffer_lines, warn_bad_lines, error_bad_lines, keep_default_na, thousands, comment, decimal, parse_dates, keep_date_col, dayfirst, date_parser, memory_map, float_precision, nrows, iterator, chunksize, verbose, encoding, squeeze, mangle_dupe_cols, tupleize_cols, infer_datetime_format, skip_blank_lines)
    472                     skip_blank_lines=skip_blank_lines)
    473 
--> 474         return _read(filepath_or_buffer, kwds)
    475 
    476     parser_f.__name__ = name

C:\Users\armsharm\AppData\Local\Continuum\Anaconda\lib\site-packages\pandas\io\parsers.pyc in _read(filepath_or_buffer, kwds)
    258         return parser
    259 
--> 260     return parser.read()
    261 
    262 _parser_defaults = 

C:\Users\armsharm\AppData\Local\Continuum\Anaconda\lib\site-packages\pandas\io\parsers.pyc in read(self, nrows)
    719                 raise ValueError('skip_footer not supported for iteration')
    720 
--> 721         ret = self._engine.read(nrows)
    722 
    723         if self.options.get('as_recarray'):

C:\Users\armsharm\AppData\Local\Continuum\Anaconda\lib\site-packages\pandas\io\parsers.pyc in read(self, nrows)
   1168 
   1169         try:
-> 1170             data = self._reader.read(nrows)
   1171         except StopIteration:
   1172             if nrows is None:

pandas\parser.pyx in pandas.parser.TextReader.read (pandas\parser.c:7544)()

pandas\parser.pyx in pandas.parser.TextReader._read_low_memory (pandas\parser.c:7784)()

pandas\parser.pyx in pandas.parser.TextReader._read_rows (pandas\parser.c:8401)()

pandas\parser.pyx in pandas.parser.TextReader._tokenize_rows (pandas\parser.c:8275)()

pandas\parser.pyx in pandas.parser.raise_parser_error (pandas\parser.c:20691)()

CParserError: Error tokenizing data. C error: Buffer overflow caught - possible malformed input file.

我也尝试过使用 csv 阅读器:-

import csv
with open("C:\work\DATA\Raw_data\\store.csv", 'rb') as f:
    reader = csv.reader(f)
    l = list(reader)

错误:-

Error                                     Traceback (most recent call last)
<ipython-input-36-9249469f31a6> in <module>()
      1 with open('C:\work\DATA\Raw_data\\store.csv', 'rb') as f:
      2     reader = csv.reader(f)
----> 3     l = list(reader)

Error: new-line character seen in unquoted field - do you need to open the file in universal-newline mode?

【问题讨论】:

【参考方案1】:

将目录更改为 CSV

Corpus = pd.read_csv(r"C:\Users\Dell\Desktop\Dataset.csv",encoding='latin-1')

【讨论】:

【参考方案2】:

如果你使用 python 并且它是一个大文件,你可以使用 engine='python' 如下,应该可以工作。

df = pd.read_csv( file_, index_col=None, header=0, engine='python' )

【讨论】:

以后请使用markdown来格式化你的帖子和回复。 在我撰写本文时,engine = 'python' 在遇到 NULL 字节时会崩溃,并鼓励在错误消息中使用 engine = 'c'。【参考方案3】:

我发现了这个错误,原因是pandas用作行终止符的数据中有一些回车符“\r”,就好像它是“\n”一样。我想我会在这里发帖,因为这可能是出现此错误的常见原因。

我找到的解决方案是将 lineterminator='\n' 添加到 read_csv 函数中,如下所示:

df_clean = pd.read_csv('test_error.csv',
                 lineterminator='\n')

【讨论】:

非常贴切,仅从错误信息中不容易弄清楚 这真是一个绝妙的答案!!为我节省了大量时间,谢谢! 你救了我的命 :-) 天哪,我已经疯了好几个小时,尝试了许多不同的分隔符,但没有任何效果。非常感谢! 我正在编写 csv 文件,后来又将它们读回,我得到了这个错误(在 linux 上运行,这在 windows 上没有发生)。仅添加 lineterminator='\n' 是不够的,我必须在编写 csv 文件时将 encoding='utf-8-sig' 添加到 to_csv。【参考方案4】:

不是一个答案,但对于评论来说太长了(不是说代码格式)

当你在 csv 模块中读取它时它会中断,你至少可以找到发生错误的行:

import csv
with open(r"C:\work\DATA\Raw_data\store.csv", 'rb') as f:
    reader = csv.reader(f)
    linenumber = 1
    try:
        for row in reader:
            linenumber += 1
    except Exception as e:
        print (("Error line %d: %s %s" % (linenumber, str(type(e)), e.message)))

然后在 store.csv 中查看该行发生了什么。

【讨论】:

对不起,回复晚了,看看 csv 有一些 unicode 字符,如 \r,-> 等导致意外转义。在源代码中替换它们就可以了。您的回答有助于将它们可视化。 对于 Python 3,只需使用 'r' 打开文件,即 open('file.csv', 'r') 即可使用 这个问题也可以通过简单地从excel工作表菜单选项中保存文件并保存为“csv”格式来解决。

以上是关于在 pandas 中读取 csv 文件时出错 [CParserError: 标记数据时出错。 C 错误:捕获缓冲区溢出 - 可能是格式错误的输入文件。]的主要内容,如果未能解决你的问题,请参考以下文章

使用 pandas.read_csv 从 URL 读取压缩的 CSV 文件时出错

读取 CSV 文件时 Python Pandas 出错

使用 Pandas 读取 CSV 时出错

python读取csv出错怎么解决

由于额外的列值,尝试使用 pandas Python 读取 csv 时出错

pandas读取csv文件时报错:ParserError: Error tokenizing data. C error