【问题标题】:python Postgresql: Ignoring the last column from csv filepython Postgresql:忽略csv文件的最后一列
【发布时间】:2011-03-31 12:03:11
【问题描述】:

我在导入 CSV 文件时遇到问题。我正在使用 postgresql 的 COPY FROM 命令将 CSV 文件复制到 2 列表中。

我有一个以下格式的 CSV 文件;

"1";"A"
"2";"B"
"3";"C";"CAD450"
"4";"D";"ABX123"

我想将 CSV 文件的所有这些行导入表中,但我想跳过任何额外添加的列。

目前我正在跳过任何包含额外列的行,例如这里的列 "1";"C";"CAD450""1";"D";"ABX123" 被跳过,我只导入前两列。但我想将所有这四行复制到我的表中。那么有什么方法可以忽略最后一列并将所有四行复制到我的表中,就像这样

"1";"A"
"1";"B"
"1";"C"
"1";"D"

【问题讨论】:

  • 您能否提供一些示例代码,您今天如何导入 CSV?您可能需要解析 CSV 的每一行并将其通过管道传输到 postgres 中,并删除多余的列。
  • 我使用以下代码从 csv 文件导入数据。 f = open(path, 'r') p = Popen(command, shell=True,stdin=PIPE, stdout=PIPE,stderr=PIPE, env=env) query = """ field1, field2) FROM STDIN WITH DELIMITER ' ;' CSV 报价 '"'; """ p.stdin.write(query.encode('ascii')) for line in f: 这里我做了一些检查,p.stdin.write(line.encode('UTF-8'))
  • 请编辑您的问题并添加格式正确的代码。在现在的评论中,这是没有用的。

标签: python postgresql


【解决方案1】:

使用 awk 预处理文件以去除多余的列:

awk -F';' '{print $1 ";" $2 }' > new_file.csv

【讨论】:

    【解决方案2】:

    通过cutawk(如上所建议的)管道比使用 python/psycopg 更容易。

    cat csv_file.csv | cut -d';' -f1,2 | psql -u USER DATABASE -c "COPY table FROM STDIN WITH DELIMITER ';';"

    【讨论】:

      【解决方案3】:
      with open("file.csv","r") as f:
          t=[line.strip().split(";")[:2] for line in f]
      

      【讨论】:

        【解决方案4】:

        解决问题的多种方法。
        我可能会做这样的事情:

        import csv
        import psycopg2
        dr = csv.DictReader(open('test.csv','rb'), 
                            delimiter=';',
                            quotechar='"',
                            fieldnames=['col1','col2']) # need not specify other cols
        CONNSTR = """
          host=127.0.0.1 
          dbname=mydb
          user=me
          password=pw
          port=5432"""
        cxn = psycopg2.connect(CONNSTR)
        cur = cxn.cursor()
        cur.execute("""CREATE TABLE from_csv (
                       id serial NOT NULL,
                       col1 character varying,
                       col2 character varying,
                       CONSTRAINT from_csv_pkey PRIMARY KEY (id));""")
        cur.executemany("""INSERT INTO from_csv (col1,col2) 
                           VALUES (%(col1)s,%(col2)s);""", dr)
        cxn.commit()
        

        【讨论】:

          猜你喜欢
          • 2011-12-14
          • 1970-01-01
          • 2018-03-25
          • 1970-01-01
          • 2021-02-13
          • 2014-08-14
          • 2019-12-01
          • 1970-01-01
          相关资源
          最近更新 更多