用python在postgres中复制(自)带有heades的csv

2024-04-24 06:25:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用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()

Tags: csv方法fromimport脚本home错误con
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)

我会在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()

相关问题 更多 >