如何从 csv 复制到 postgresql table 并忽略没有 header 的列

How copy from csv to postgresql table and ignore columns without header

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

  1. 接收带有 header 的 csv。
  2. 在 PostgreSQL 上的数据库上创建 table,其中字段是 header 的 csv。
  3. 将csv的数据复制到step2中创建的table

这里是第 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 输入的最后一列没有 header,并且上面的代码失败

File "copy_to_psql.py", line 18, in load_csv_psql

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

psycopg2.DataError: extra data after last expected column

有没有办法只 select 来自 csv 的 header 列?

是否有仅使用 PostgreSQL 的解决方案?

还有其他建议吗?

提前致谢

如@ABAbhi 所述,我最好的选择是清理 csv。

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

的列
  1. 接收带有 header.
  2. 的 csv
  3. 在字段所在的 PostgreSQL 数据库上创建一个 table csv 的 headers.
  4. 删除没有 header 的列。
  5. 将数据csv复制到table步骤2
  6. 中创建的

这里是第 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)