2010-08-26 21 views
4

我想獲得一個快速即快速並且不是很多代碼的方式來將csv數據導入到postgres數據庫中。我正在閱讀python使用csvDictreader工作正常。然後,我需要以某種方式生成代碼,將代碼放入表中。我想自動執行此操作,因爲我的表格通常有數百個變量。 (我不想直接讀取到Postgres的,因爲在很多情況下,我必須轉換數據和Python是適合這種模式)使用psycopg2讀取csvData的好方法

這是一些什麼,我已經得到:

import psycopg2 
import sys 
import itertools 

import sys, csv 
import psycopg2.extras 
import psycopg2.extensions 

csvReader=csv.DictReader(open('/home/matthew/Downloads/us_gis_data/statesp020.csv', "rb"), delimiter = ',') 
#close.cursor() 
x = 0 
ConnectionString = "host='localhost' dbname='mydb' user='postgres' password='######" 
try: 
    connection = psycopg2.extras.DictConnection(ConnectionString) 
    print "connecting" 
except: 
    print "did not work" 
# Create a test table with some data 

dict_cur = connection.cursor() 

#dict_cur.execute("CREATE TABLE test (id serial PRIMARY KEY, num integer, data varchar);") 
for i in range(1,50): 
    x = x+1 
    print x 
    dict_cur.execute("INSERT INTO test (num, data) VALUES(%s, %s)",(x, 3.6))#"abc'def")) 
    ### how to I create the table and insert value using the dictreader? 

dict_cur.execute("SELECT * FROM test") 
for k in range(0,x+1): 
    rec = dict_cur.fetchone() 
    print rec['num'], rec['data'] 

回答

4

說你有字段名的列表(想必你可以從你的csv文件的頭部得到這個):

fieldnames = ['Name', 'Address', 'City', 'State'] 

假設他們都是VARCHAR處理,您可以創建表「表名」:

sql_table = 'CREATE TABLE TableName (%s)' % ','.join('%s VARCHAR(50)' % name for name in fieldnames) 
cursor.execute(sql_table) 

您可以從字典「字典」插入行:

sql_insert = ('INSERT INTO TableName (%s) VALUES (%s)' % 
       (','.join('%s' % name for name in fieldnames), 
       ','.join('%%(%s)s' % name for name in fieldnames))) 
cursor.execute(sql_insert, dict) 

或做它一氣呵成,給定一個列表字典:

dictlist = [dict1, dict2, ...] 
cursor.executemany(sql_insert, dictlist) 

可以將此作爲必要的調整基礎上,你的領域的類型和使用DictReader。

+0

Ars 謝謝我會試試這個。 馬修 – Matthew 2010-08-26 04:23:17

1

我是新手,但這對我很有用。我使用PG Admin創建'testCSV'表。

import psycopg2 as dbapi 

con = dbapi.connect(database="testpg", user="postgres", password="secret") 

cur = con.cursor() 

import csv 
csvObject = csv.reader(open(r'C:\testcsv.csv', 'r'), dialect = 'excel', delimiter = ',') 

passData = "INSERT INTO testCSV (param1, param2, param3, param4, param5) VALUES (%s,%s,%s,%s,%s);" 

for row in csvObject: 
    csvLine = row  
    cur.execute(passData, csvLine) 

con.commit() 
相關問題