用Python从带标题的csv复制数据到Postgres
我正在尝试用一个Python脚本从CSV文件填充一个表格。
接下来这个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()
2 个回答
2
我建议你先在Python中处理csv文件。最好把从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)
20
我建议在 cur.copy_expert()
之后使用 con.commit()
。
另外,如果数据集很大,我会避免像上面 Sam P. 提到的那样逐行处理和上传文件。使用 cur.copy_expert()
会快很多。
conn = psycopg2.connect('postgresql://scott:tiger@localhost: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()