[英]Dynamically handling data columns in csv for import to Postgresql
我是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導入的時間戳的關系,建議采取什么措施? 清單,清單清單,字典或元組?
我不是在請求特定的代碼,只是一些指導。 謝謝。
您可以使用csv
模塊來解析輸入文件,並且可以通過它的第一行來構建(准備)帶有列名和%s
而不是值的psycopg
insert語句。 對於其余的行,只需執行以下語句,並將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()
...
對於您的示例,您將必須更正列名。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.