【问题标题】:Remove last column from large CSV file从大型 CSV 文件中删除最后一列
【发布时间】:2020-08-05 11:58:38
【问题描述】:

我有一个大的 CSV 文件,我想使用 datagrip 上传到 postgres。当我上传它时,我收到一些记录的以下错误:

11807:98: actual: value separator (,), expected: record separator (\n) 

问题是只有 19 列被识别,而在极少数记录中有 20 个值。对于那些记录,它根本不导入记录。我确实希望在我的数据库中拥有所有行。

我认为这将是 python 中的小菜一碟。所以我开始使用 pandas 并使用以下行加载数据:

 df = pd.read_csv('filename.csv', sep='delimiter', header=None)

确实包含文件。但是,要删除 19 逗号后面的所有值,或者只添加完整的第 20 列,我以后可以删除它,这比我预期的要困难得多。感觉这是一个微不足道的问题,我需要朝着正确的方向努力。

【问题讨论】:

  • 你能提供更多细节吗?文件的文件样本将是理想的。
  • 可能更容易将问题行提取到新文件中,然后检查、编辑和重新处理它们。
  • 也许通过添加 names=range(20) 然后删除最后一列 df.drop(19, 1) 来告诉 read_csv 列数会起作用吗?

标签: python pandas postgresql csv


【解决方案1】:

以这种方式将其读入数据框不会给您带来任何好处,因为每个单元格都将包含一行文件。

请改用csv 模块,因为它不会尝试将文件作为固定宽度的表格来读取。

import csv

with open('filename.csv', 'r') as i, open('fixed.csv', 'w') as o:
    cr = csv.reader(i)
    cw = csv.writer(o)
    for row in cr:
        cw.writerow(row[0:19])


【讨论】:

    【解决方案2】:

    这会生成一个包含 30 列的数据框,然后删除第 20 列之后的所有列。

    df = pd.DataFrame({f"col{i}":[1,2,3] for i in range(30)})
    
    df = df.drop(columns=[c for c in df.columns[20:]])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-15
      相关资源
      最近更新 更多