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

如何从csv复制到postgresql表并忽略没有标题的列,postgresql,python-2.7,csv,psycopg2,postgresql-copy,Postgresql,Python 2.7,Csv,Psycopg2,Postgresql Copy,我有一个python脚本,基本上有这个工作流 接收带有标题的csv 在PostgreSQL上的数据库上创建表,其中字段是csv的标题 将csv的数据复制到步骤2中创建的表中 这里是步骤3的代码片段 file_object = open(file_csv) cur = connection.cursor() copy_sql = """ COPY %sFROM stdin WITH CSV HEADER DELIMITER as '""" + delimiter +"'" cur.c

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

  • 接收带有标题的csv
  • 在PostgreSQL上的数据库上创建表,其中字段是csv的标题
  • 将csv的数据复制到步骤2中创建的表中
  • 这里是步骤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的解决方案

    还有其他建议吗


    提前感谢您提到@ABAbhi,我最好的选择是清理csv

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

  • 接收带有标题的csv
  • 在PostgreSQL上的数据库上创建一个表,其中包含字段 csv的标题
  • 删除没有标题的列
  • 将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)
    

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

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

  • 接收带有标题的csv
  • 在PostgreSQL上的数据库上创建一个表,其中包含字段 csv的标题
  • 删除没有标题的列
  • 将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)
    

    如果系统中安装了Java,请尝试使用DBIS。我认为它不能取代表格创建过程。但您可以将其配置为通过将名称与列名匹配,将数据从csv放置到数据库。您可以扩展一些Java特性并编写定制代码@谢谢你的建议,我认为我可以用java解决这个问题,但我只想用python和PostgreSQL解决这个问题。我想我只能用标题栏创建一个新的csv,但我正在寻找一个更直接的解决方案。清理csv是最好的选择。@Abhishakegupta我有一个清理csv的解决方案,但我试图看看是否有其他选择,但正如您所说,这似乎是最好的选择。@Cyberguille我建议使用Java解决方案,因为您只需配置无需编码即可替代python要求。如果您想通过PostgreSQL实现,那么导入CSV命令行如何?是的,您应该有所需的列名,动态是不可能的。如果系统中安装了Java,请尝试使用DBIS。我认为它不能取代表格创建过程。但您可以将其配置为通过将名称与列名匹配,将数据从csv放置到数据库。您可以扩展一些Java特性并编写定制代码@谢谢你的建议,我认为我可以用java解决这个问题,但我只想用python和PostgreSQL解决这个问题。我想我只能用标题栏创建一个新的csv,但我正在寻找一个更直接的解决方案。清理csv是最好的选择。@Abhishakegupta我有一个清理csv的解决方案,但我试图看看是否有其他选择,但正如您所说,这似乎是最好的选择。@Cyberguille我建议使用Java解决方案,因为您只需配置无需编码即可替代python要求。如果您想通过PostgreSQL实现,那么导入CSV命令行如何?是的,你应该有必要的列名,动态将是不可能的。