Хороший способ чтения csvData с помощью psycopg2 - PullRequest
4 голосов
/ 26 августа 2010

Я пытаюсь получить быстрый, т. Е. Быстрый и не слишком много кода, способ получения данных csv в базу данных postgres. Я читаю в Python с помощью csvDictreader, который работает нормально. Затем мне нужно каким-то образом сгенерировать код, который будет определять и помещать его в таблицу. Я хочу сделать это автоматически, поскольку мои таблицы часто содержат сотни переменных. (Я не хочу читать напрямую в Postgres, потому что во многих случаях я должен преобразовывать данные, и Python хорош для этого)

Вот что я получил:

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']

Ответы [ 2 ]

4 голосов
/ 26 августа 2010

Скажем, у вас есть список имен полей (вероятно, вы можете получить это из заголовка вашего CSV-файла):

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

Предполагая, что они все VARCHAR, вы можете создать таблицу "TableName":

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

Вы можете вставить строки из словаря "dict":

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.

1 голос
/ 20 апреля 2011

Я новичок, но у меня это сработало.Я использовал 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()
...