0

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

  1. 接收带有标题的 csv。
  2. 在 PostgreSQL 上的数据库上创建表,其中字段是 csv 的标题。
  3. 将csv的数据复制到第二步创建的表中

这里是步骤 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 的解决方案?

还有什么建议吗?

提前致谢

4

1 回答 1

2

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

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

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

这里是第 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)
于 2018-05-03T02:55:14.733 回答