如何从csv复制到posgres表并忽略没有标题的列

时间:2018-04-26 17:11:19

标签: postgresql python-2.7 csv psycopg2 postgresql-copy

我在python中有一个基本上有这个工作流程的脚本

  1. 收到带标题的csv。
  2. 在PostgreSQL上的数据库上创建表,其中字段是csv的标题。
  3. 将csv的数据复制到第2步中创建的表
  4. 这里是步骤3的代码片段

    file_object = open(file_csv)
    cur = connection.cursor()
    copy_sql = """
       COPY %sFROM stdin WITH CSV HEADER
       DELIMITER as '""" + delimiter +"'"
    
    cur.copy_expert(sql=copy_sql % table,file = file_object)
    connection.commit()
    cur.close()
    

    此脚本正常工作,但某些csv输入的最后一列没有标题,上面的代码失败

      

    文件“copy_to_psql.py”,第18行,在load_csv_psql中

    cur.copy_expert(sql=copy_sql % table,file = file_object)
    
         

    psycopg2.DataError:上一个预期列

    之后的额外数据

    有没有办法只选择带有来自csv的标题的列?

    有没有只使用PostgreSQL的解决方案?

    还有其他建议吗?

    提前致谢

1 个答案:

答案 0 :(得分:1)

提到@ABAbhi,我最好的选择是清理csv。

因此,对于我的算法的工作流程,我添加了一个步骤来删除没有

的列
  1. 使用标题接收csv。
  2. 在PostgreSQL上的数据库上创建一个表,其中包含字段 csv的标题。
  3. 删除没有标题的列。
  4. 将数据csv复制到步骤2中创建的表
  5. 听取第3步的代码:

    def remove_empty_colums(input_csv="in.csv", output_csv="out.csv", delimiter=','):
        reader = csv.DictReader(open(input_csv), delimiter=delimiter)
        headers = reader.fieldnames
        writer = csv.DictWriter(open(output_csv, 'wb'),
                                fieldnames=headers, delimiter=delimiter)
        writer.writeheader()
        for row in reader:
            row_dict = {}
            for header in headers[:-1]:
                row_dict[header] = row[header]
            writer.writerow(row_dict)