在熊猫中打开损坏的csv文件的策略

Posted

技术标签:

【中文标题】在熊猫中打开损坏的csv文件的策略【英文标题】:Strategy to open a corrupt csv file in pandas 【发布时间】:2014-02-04 23:21:57 【问题描述】:

我有一堆 csv 文件,我可以在 Pandas 中加载它们,但是一个文件正在运行,我以这种方式打开它:

df = pd.DataFrame.from_csv(csv_file)

错误:

文件 "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/core/frame.py", 第 1268 行,在 from_csv encoding=encoding,tupleize_cols=False) 文件 "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/io/parsers.py", 第 400 行,在 parser_f 中 返回_read(filepath_or_buffer,kwds)文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/io/parsers.py”, 第 198 行,在 _read parser = TextFileReader(filepath_or_buffer, **kwds) 文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/io/parsers.py”, 第 479 行,在 init 中 self._make_engine(self.engine)文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/io/parsers.py”, 第 586 行,在 _make_engine self._engine = CParserWrapper(self.f, **self.options) 文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/io/parsers.py”, 第 957 行,在 init 中 self._reader = _parser.TextReader(src, **kwds) 文件“parser.pyx”,第 477 行,在 pandas.parser.TextReader.cinit (pandas/parser.c:4434) 文件“parser.pyx”,第 599 行,在 pandas.parser.TextReader._get_header (pandas/parser.c:5831) pandas.parser.CParserError: Passed header=0 但文件中只有 0 行

对我来说,这意味着文件中存在某种损坏,快速查看似乎很好,但它是一个大文件,并且目视检查每一行不是一个选项,什么是一个好的策略对 pandas 无法打开的 csv 文件进行故障排除?

谢谢

【问题讨论】:

【参考方案1】:

看起来 pandas 将第 0 行指定为标题。尝试调用:

df = pd.DataFrame.from_csv(csv_file,header=None)

    df = pd.DataFrame.read_csv(csv_file,header=None)

但是,奇怪的是文件似乎有零行(即它是空的)。可能是文件路径不对?

【讨论】:

我已经仔细检查了文件路径,它肯定是正确的,它实际上是在读取文件直到崩溃,我试过不使用 header=None,同样的问题。仔细查看 csv 文件,似乎有些行已损坏,例如数据与标题不匹配,因此您最终得到一个字符串而不是日期等......有没有办法过滤掉可能使用 Pandas 的坏行? 我也尝试过使用:df = pd.read_csv(csv_file, index_col=0, parse_dates=True,error_bad_lines=False) 但不幸的是同样的问题 是否可能存在行终止问题或回车问题?看起来你在 Mac 上。如果您可以访问另一个操作系统,并且可以将 .csv 文件移到那里尝试,那可能会告诉您一些信息。它说文件有0行。我不确定这是否意味着单行(如第 0 行)或者它真的意味着 pandas 将其视为一个空文件。【参考方案2】:

如果在 Linux 中用 head 在操作系统中打开它来检查它,然后用 awk 或 sed 修复它。如果在 Windows 中,你也可以尝试 vim 来检查和修复它。简而言之,在 Pandas 中修复文件可能不是最好的。您很可能有奇怪的行尾(因为错误消息显示 0 行),因此需要以文件或 cat 开头或使用 Vim 来确定行尾,以便您决定如何最好地修复或处理。

【讨论】:

【参考方案3】:

我遇到了像你这样的问题:


/usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas-0.13.1_601_g4663353-py2.7-macosx-10.9- x86_64.egg/pandas/io/parsers.pyc in init(self, src, **kwds) 970 kwds['allow_leading_cols'] = self.index_col 不是 False 971 --> 972 self._reader = _parser.TextReader(src, **kwds) 973 第974章

/usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas-0.13.1_601_g4663353-py2.7-macosx-10.9- x86_64.egg/pandas/parser.so 在 pandas.parser.TextReader.cinit (pandas/parser.c:4628)()

/usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas-0.13.1_601_g4663353-py2.7-macosx-10.9- x86_64.egg/pandas/parser.so 在 pandas.parser.TextReader._get_header (pandas/parser.c:6068)()

CParserError: Passed header=0 但文件中只有 0 行


我的代码是:

df = pd.read_csv('/Users/steven/Documents/Mywork/Python/sklearn/beer/data')

最后,我发现我犯了一个错误:我将目录路径而不是文件发送到 read_csv

正确的代码是:

df = pd.read_csv('/Users/steven/Documents/Mywork/Python/sklearn/beer/data/beer_reviews.csv')

它运行正确。

所以,我认为您的问题的原因在于您发送的文件。也许就像我所做的那样,它是目录的路径。可能文件为空或损坏,或者编码设置错误。

希望以上内容对你有所帮助。

【讨论】:

以上是关于在熊猫中打开损坏的csv文件的策略的主要内容,如果未能解决你的问题,请参考以下文章

熊猫 - 快速读取/写入相同的csv ..获取权限错误

csv文件,excel保存后再打开乱码。

无法让熊猫打开 CSV [Python, Jupyter, Pandas]

在for循环中使用熊猫csv_read读取csv文件

将熊猫数据框保存到csv时如何保留numpy数组

将熊猫数据框保存到csv时如何保留numpy数组