как автоматически создать таблицу на основе CSV в postgres, используя python - PullRequest
0 голосов
/ 14 июля 2020

Я новый программист Python и пытаюсь импортировать образец файла CSV в свою Postgres базу данных с помощью сценария python. У меня есть файл CSV с именем abstable1, у него 3 заголовка:

absid, name, number У меня много таких файлов в папке. Я хочу создать таблицу в PostgreSQL с тем же именем, что и CSV-файл для всех.

Вот код, который я пытался просто создать таблицу для одного файла для тестирования:

import psycopg2
import csv
import os

#filePath = 'c:\\Python27\\Scripts\\abstable1.csv'
conn = psycopg2.connect("host= hostnamexx dbname=dbnamexx user= usernamexx password= pwdxx")
print("Connecting to Database")
cur = conn.cursor()

#Uncomment to execute the code below to create a table
cur.execute("""CREATE TABLE abs.abstable1(
absid varchar(10) PRIMARY KEY,
name integer,
number integer 
)
 """)
#to copy the csv data into created table
with open('abstable1.csv', 'r') as f:
    next(f)
    cur.copy_from(f, 'abs.abstable1', sep=',')
conn.commit()
conn.close()

Это ошибка, которую я получаю:

File "c:\Python27\Scripts\testabs.py", line 26, in <module>
    cur.copy_from(f, 'abs.abstable1', sep=',')
psycopg2.errors.QueryCanceled: COPY from stdin failed: error in .read() call: exceptions.ValueError Mixing iteration and read methods would lose data
CONTEXT:  COPY abstable1, line 1

Мы приветствуем любые рекомендации или альтернативные решения для решения этой проблемы.

Ответы [ 2 ]

0 голосов
/ 28 июля 2020

Вот что у меня сработало: import glob

Этот код автоматически считывает все файлы CSV в папке и создает таблицу с тем же именем, что и у файла. Хотя я ' m все еще пытается выяснить, как извлечь указанные c типы данных в соответствии с данными в CSV. Но что касается создания таблиц, это работает как шарм для всех файлов CSV в папке.

import csv
import psycopg2
import os
import glob


conn = psycopg2.connect("host= hostnamexx dbname=dbnamexx user= usernamexx password= 
pwdxx")
print("Connecting to Database")

csvPath = "./TestDataLGA/"

# Loop through each CSV
for filename in glob.glob(csvPath+"*.csv"):
# Create a table name
tablename = filename.replace("./TestDataLGA\\", "").replace(".csv", "")
print tablename

# Open file
fileInput = open(filename, "r")

# Extract first line of file
firstLine = fileInput.readline().strip()


# Split columns into an array [...]
columns = firstLine.split(",")
     

# Build SQL code to drop table if exists and create table
sqlQueryCreate = 'DROP TABLE IF EXISTS '+ tablename + ";\n"
sqlQueryCreate += 'CREATE TABLE'+ tablename + "("

#some loop or function according to your requiremennt
# Define columns for table
for column in columns:
    sqlQueryCreate += column + " VARCHAR(64),\n"

sqlQueryCreate = sqlQueryCreate[:-2]
sqlQueryCreate += ");"

cur = conn.cursor()
cur.execute(sqlQueryCreate)
conn.commit()
cur.close()
0 голосов
/ 14 июля 2020

Я пробовал ваш код и отлично работает

import psycopg2

conn = psycopg2.connect("host= 127.0.0.1 dbname=testdb user=postgres password=postgres")
print("Connecting to Database")
cur = conn.cursor()

'''cur.execute("""CREATE TABLE abstable1(
absid varchar(10) PRIMARY KEY,
name integer,
number integer 
)
""")'''

with open('lolo.csv', 'r') as f:
    next(f)
    cur.copy_from(f, 'abstable1', sep=',', columns=('absid', 'name', 'number'))

conn.commit()
conn.close()

хотя мне пришлось внести некоторые изменения, чтобы он работал: мне пришлось назвать таблицу abstable1 , потому что я использовал abs .abstable1 postgres предполагает, что я использую схему abs , возможно, вы создали эту схему в своей базе данных, если не проверяете это, также я использую python 3.7, я заметил, что вы используете python 2.7 (который, я думаю, больше не поддерживается), это может вызвать проблемы, так как вы говорите, что учитесь, я бы рекомендовал вам использовать python 3, так как он больше используется сейчас, и вы, скорее всего, столкнетесь с кодом написано на нем, и вам придется адаптировать свой код, чтобы он соответствовал вашему python 2.7

...