我是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导入的时间戳的关系,建议什么?列表,列表,词典或元组列表?
我不是要求具体的代码,只是一些指导。谢谢。
答案 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()
...
对于您的示例,您必须更正列名称。