用Python从带标题的csv复制数据到Postgres

8 投票
2 回答
26106 浏览
提问于 2025-04-18 19:36

我正在尝试用一个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()

撰写回答