动态处理csv中的数据列以导入Postgresql

时间:2014-01-03 00:12:04

标签: python postgresql csv python-3.x

我是python(3)的新手,很难找到如何处理以下场景的相关示例。我知道这是一个“最好的”问题的边缘,但希望有一个明确适当的方法。

我有包含时间戳的csv数据文件,然后至少有一列数据,其名称由主列表定义(即所有可能的列标题都是已知的)。例如:

File1.csv

date-time, data a, data b
2014-01-01, 23, 22
2014-01-01, 23, 22d

File2.csv

date-time, data d, data a
2014-01-01, 99, 20
2014-01-01, 100, 22

我一直在试图了解何时使用元组,列表和字典来导入postgresql这种类型的场景。由于列顺序可以更改,列的列表每次都不同(尽管总是来自主集),我不确定如何最好地生成包含时间戳和列的数据集,然后执行插入postgresql表,其中为未指定的列提供值。

鉴于列的存在的动态特性以及需要通过psycopg维护与Postgresql导入的时间戳的关系,建议什么?列表,列表,词典或元组列表?

我不是要求具体的代码,只是一些指导。谢谢。

1 个答案:

答案 0 :(得分:0)

您可以使用csv模块来解析输入文件,通过它的第一行,您可以构建(准备)psycopg插入带有列名和%s的语句而不是值。对于其余行,只需使用row作为值执行此语句:

connect_string = 'dbname=test host=localhost port=5493 user=postgres password=postgres'
connection = psycopg2.connect(connect_string)
cursor = connection.cursor()
f = open(fn, 'rt')
try:
    reader = csv.reader(f)
    cols = []
    for row in reader:
        if not cols:
            cols = row
            psycopg_marks  = ','.join(['%s' for s in cols])
            insert_statement = "INSERT INTO xyz (%s) VALUES (%s)" % (','.join(cols), psycopg_marks)
            print(insert_statement)
        else:
            print(row)
            cursor.execute(insert_statement, row)
finally:
    f.close()

...

对于您的示例,您必须更正列名称。