【问题标题】:Read all but last line of CSV file in pandas读取 pandas 中除最后一行之外的所有 CSV 文件
【发布时间】:2020-08-07 17:10:14
【问题描述】:

我有在 pandas 中读取的 CSV 文件:

#!/usr/bin/env python

import pandas as pd
import sys

filename = sys.argv[1]
df = pd.read_csv(filename)

很遗憾,这些文件的最后一行经常损坏(逗号数量错误)。目前我在文本编辑器中打开每个文件并删除最后一行。

是否可以删除加载 CSV 的同一 python/pandas 脚本中的最后一行,以节省必须采取这个额外的非自动化步骤?

【问题讨论】:

  • 你删除了一个关于提取数字的问题,无论如何我建议使用str.extract:for col in df.columns[2:]: df[col] = df[col].str.extract(r'(\d+)').astype(int)
  • @EdChum 您的代码是否保留小数点?
  • @EdChum 我取消了上一个问题。

标签: python pandas dataframe


【解决方案1】:

通过error_bad_lines=False会自动跳过这一行

df = pd.read_csv(filename, error_bad_lines=False)

error_bad_lines 的优点是它会跳过并且不会在任何错误的行上出错,但如果最后一行总是 duff 那么skipfooter=1 会更好

感谢@DexterMorgan 指出skipfooter 选项强制引擎使用比c 引擎解析csv 慢的python 引擎。

【讨论】:

  • 关于skipfooter 选项,最好知道它不适用于dtypes 选项:ValueError: Falling back to the 'python' engine because the 'c' engine does not support skipfooter, but this causes 'dtype' to be ignored as it is not supported by the 'python' engine. (Note the 'converters' option provides similar functionality.)
  • @DexterMorgan 肯定会添加
  • 有一个选项'skiprows',c引擎支持。如果您知道 csv 的行数,您可以按如下方式添加:pd.read_csv(filename, skiprows=[999])(在我的情况下有 1000 行) - 请注意,如果您想在给定行号的情况下指定行,则必须在列表中定义行.
  • @Chaoste 但是坏行在最后,你不想用nrows 代替吗?
  • @EdChum 我只是在查看文档,因为我现在需要它,直到现在我才看到这个选项。谢谢!所以在我的情况下,而不是skiprows=[1000],我不得不写nrows=999。另一种解决方案可能是通过非常快的命令行删除最后一行:head -n -1 dataframe.csv > temp.csv && mv temp.csv dataframe.csv
【解决方案2】:

阅读http://pandas.pydata.org/pandas-docs/version/0.16.2/generated/pandas.read_csv.html。这里 'skipfooter' 参数可用于指定您不想从 .csv 文件末尾读取的行数。可能对你有帮助。

【讨论】:

    【解决方案3】:

    在读取 csv 时,您可以使用 skipfooter 参数省略最后 n 行:

    df = pd.read_csv(filename, skipfooter=3, engine='python')
    

    在本例中,最后 3 行被省略。

    【讨论】:

      猜你喜欢
      • 2019-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-16
      • 2011-04-16
      • 2016-12-06
      • 1970-01-01
      相关资源
      最近更新 更多