在postgres中逐行读取和存储csv数据

时间:2011-04-14 11:54:07

标签: python postgresql

我想从不同的文件中复制csv数据然后存储在表中。但问题是,每个csv文件中的列差异数量,所以一些csv文件有3列而有些有4列。所以如果文件中有4列,我想简单地忽略第四列并仅保存前三。

使用以下代码,如果只有3列,我可以将数据复制到表中

CREATE TABLE ImportCSVTable (
          name varchar(100),
                  address varchar(100),
                  phone varchar(100));




COPY ImportCSVTable (name , address , phone)
         FROM 'path'
        WITH DELIMITER ';' CSV QUOTE '"';

但我期待单独检查每一行,然后将其存储在表格中。

谢谢。

3 个答案:

答案 0 :(得分:3)

由于您希望一次只读取并存储一行,Python csv module应该可以轻松读取CSV文件中的前3列,无论是否有任何额外的列。

您可以构造一个INSERT语句并使用您首选的Python-PostGreSQL模块执行它。我过去使用过pyPgSQL;不知道现在的情况。

#!/usr/bin/env python
import csv
filesource = 'PeopleAndResources.csv'
with open(filesource, 'rb') as f:
    reader = csv.reader(f, delimiter=';', quotechar='"')
    for row in reader:
        statement = "INSERT INTO ImportCSVTable " + \
        "(name, address, phone) " + \
        "VALUES ('%s', '%s', '%s')" % (tuple(row[0:3]))
        #execute statement

答案 1 :(得分:0)

使用文本实用程序切断第四列。这样,所有输入文件都有三列。 awkcutsed的某些组合应该为您处理,但这取决于您的列的外观。

答案 2 :(得分:0)

你也可以让你的输入表有一个可以为空的第四列,然后在导入之后删除额外的列。