【问题标题】:Removing a row from CSV with python if data wasn't recorded in a column如果数据未记录在列中,则使用 python 从 CSV 中删除一行
【发布时间】:2016-07-09 05:57:42
【问题描述】:

我正在尝试将一批 CSV 导入 PostgreSQL,但经常遇到数据丢失的问题:

psycopg2.DataError:列“column_name”缺少数据上下文:
COPY table_name,行 CSV 中没有数据的位置
记录,这里是缺失列的数据值

有时无法将完整的数据集写入行,我必须按原样处理文件。如果数据未记录到任何列中,我正在尝试找出一种删除该行的方法。这是我所拥有的:

file_list = glob.glob(path)

for f in file_list:
    filename = os.path.basename(f) #get the file name
    arc_csv = arc_path + filename #path for revised copy of CSV

    with open(f, 'r') as inp, open(arc_csv, 'wb') as out:
        writer = csv.writer(out)
        for line in csv.reader(inp):
            if "" not in line: #if the row doesn't have any empty fields
                writer.writerow(line)

    cursor.execute("COPY table_name FROM %s WITH CSV HEADER DELIMITER ','",(arc_csv,))

【问题讨论】:

  • 由于我的代表低于 15,我的回复分数不会显示。感谢 cant 和 alecxe!

标签: python postgresql csv psycopg2


【解决方案1】:

您可以使用 pandas 删除缺少值的行:

import glob, os, pandas

file_list = glob.glob(path)

for f in file_list:
    filename = os.path.basename(f)
    arc_csv = arc_path + filename
    data = pandas.read_csv(f, index_col=0)
    ind = data.apply(lambda x: not pandas.isnull(x.values).any(), axis=1)
    # ^ provides an index of all rows with no missing data
    data[ind].to_csv(arc_csv) # writes the revised data to csv

但是,如果您使用大型数据集,这可能会变慢。

编辑 - 添加index_col=0 作为pandas.read_csv() 的参数以防止添加索引列问题。这使用 csv 中的第一列作为现有索引。如果您有理由不使用第一列作为索引,请将 0 替换为另一列的编号。

【讨论】:

  • 谢谢!似乎几乎正确,除了它创建了一个新列(A 列),其中的行编号(0 - 最后一行 #)。现在阅读更多关于熊猫的内容。
  • 我的错,编辑了我的帖子以防止出现额外的列问题。 Pandas 数据框需要一个索引,因此如果未指定,则会生成一个新的。
  • 再次感谢。我已经开始阅读熊猫了,你马上就可以得到答案了!我还在阅读 alecxe 引起我注意的问题。
【解决方案2】:

很遗憾,您无法参数化表名或列名。使用字符串格式,但确保正确验证/转义值:

cursor.execute("COPY table_name FROM {column_name} WITH CSV HEADER DELIMITER ','".format(column_name=arc_csv))

【讨论】:

    猜你喜欢
    • 2020-05-20
    • 1970-01-01
    • 2011-07-12
    • 2015-10-13
    • 1970-01-01
    • 2021-03-21
    • 2021-01-12
    • 2019-03-09
    • 1970-01-01
    相关资源
    最近更新 更多