如何从csv复制到postgresql表,并忽略没有头的列。

问题描述 投票:0回答:1

我有一个python脚本,基本上有如下工作流程

  1. 接收一个带头的csv。
  2. 在PostgreSQL的数据库中创建表,其中的字段是csv的头。
  3. 将csv的数据复制到步骤2中创建的表中。

这里是第三步的代码片段

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的解决方案?

有其他建议吗?

先谢谢你

postgresql python-2.7 csv psycopg2 postgresql-copy
1个回答
2
投票

正如 @ABhi 所说,我最好的选择是清理 csv。

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

  1. 接收一个带头的csv文件,在PostgreSQL上创建一个表,其中的字段是csv的头。
  2. 在PostgreSQL的数据库中创建一个表,其中的字段是csv的头。
  3. 删除没有头的列。
  4. 将csv数据复制到步骤2中创建的表中。

而这里是第三步的代码。

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)
© www.soinside.com 2019 - 2024. All rights reserved.