2014-08-29 2 views
1

Я пытаюсь заполнить таблицу из файлов CSV в сценарии python.Копирование (из) csv с заголовками в postgres с python

SQL-оператор, который следует, работает без ошибок:

COPY registro 
FROM '/home/pablo/Escritorio/puntos/20140227.csv' 
DELIMITER ',' 
CSV header; 

CSV имеет заголовки, и используя header параметр, он импортирует без ошибок.

Проблема возникает, когда я выполняю ее из моего сценария python. Единственный способ, которым я не пытался импортировать заголовки, - это метод copy_expert(). Я не получаю сообщение об ошибке, но таблица остается пустой после запуска скрипта Python.

Любая возможная подсказка? Или, может быть, любой другой способ скопировать таблицу из CSV с заголовками?

Спасибо.

#/usr/bin/env python 
# -*- coding: utf-8 -*- 
import psycopg2 
import os 
import glob 
DSN = "dbname=gps user=postgres host=localhost" 
con = psycopg2.connect(DSN) 
cur = con.cursor() 
my_file = open('/home/pablo/Escritorio/puntos/20140227.csv') 
#This is only a test file, not all the directory 
sql = "COPY registro FROM stdin DELIMITER \',\' CSV header;" 
cur.copy_expert(sql, my_file) 
cur.close() 
con.close() 
+0

возможно дубликат [Воссоздание Postgres COPY непосредственно в Python?] (Http://stackoverflow.com/questions/1869973/recreating-postgres-copy-directly-in-python) – DrColossos

+1

Я не думаю, что это является дубликатом, он не говорит о copy_expert(), ни заголовки CSV – ppardoz

+0

Это больше похоже на «Это тоже может работать» забыл написать это как комментарий. – DrColossos

ответ

1

Я бы порекомендовал сначала обработать файл csv в python. Лучше всего структурировать данные, вытащенные из файла csv, в строки/столбцы (в python это будут вложенные списки или список кортежей), тогда вы можете построить & выполнение команд SQL на основе этих данных итеративно.

Используйте библиотеку csv для взаимодействия с файлом csv, ознакомьтесь с документацией здесь: https://docs.python.org/2/library/csv.html. Он очень удобен для пользователя и поможет вам справиться с множеством проблем.

Вот способ сделать это без csv (так как я не могу вспомнить все функции с верхней части моей головы), однако, было бы лучше не использовать этот подход:

#/usr/bin/env python 
# -*- coding: utf-8 -*- 
import psycopg2 
import os 
import glob 
DSN = "dbname=gps user=postgres host=localhost" 
con = psycopg2.connect(DSN) 
cur = con.cursor() 

# 'rb' used as I don't know the encoding of your file 
# just use r if it's in utf-8 or a known/consistent charset 
with open(file,'rb') as open_file: 
    my_file = open_file.read().decode('utf-8','ignore') 

data = my_file.splitlines() 
data = [r.split(delimiter) for r in data] 

data = data[1:] # get rid of headers 

for r in data: 
    # create command 
    # cur.execute(command) 
+0

Эта строка помогает мне при чтении данных из csv/json и копирования в flex в vertica. Спасибо - :) my_file = open_file.read(). Decode ('utf-8', 'ignore') –

+0

проверьте это для деталей. http://stackoverflow.com/questions/33710664/copying-data-to-vertica-using-python/38994233#38994233 –

3

Я d попытка con.commit() после cur.copy_expert().

Также я бы избегал предварительной обработки и загрузки файла подряд за строкой, как указал Сэм П., если набор данных большой. cur.copy_expert() значительно быстрее.

conn = psycopg2.connect('postgresql://scott:[email protected]:5432/database') 
cur = conn.cursor() 
copy_sql = """ 
      COPY table_name FROM stdin WITH CSV HEADER 
      DELIMITER as ',' 
      """ 
with open(path, 'r') as f: 
    cur.copy_expert(sql=copy_sql, file=f) 
    conn.commit() 
    cur.close() 
+0

Не должны ли вы также закрыть соединение? – aydow

+0

Имеет ли метод copy_from (file, table_name, feature = value) параметр header = true? –

Смежные вопросы