python Postgresql:忽略csv文件的最后一列

时间:2011-03-30 21:13:45

标签: python postgresql

我在导入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"

4 个答案:

答案 0 :(得分:2)

使用awk预处理文件以去除额外的列:

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

答案 1 :(得分:2)

通过cutawk进行管道处理(如上所述)比使用python / psycopg更容易。

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

答案 2 :(得分:1)

with open("file.csv","r") as f:
    t=[line.strip().split(";")[:2] for line in f]

答案 3 :(得分:1)

处理问题的方法很多。
我可能会做这样的事情:

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()