使用python和psycopg2将CSV导入postgres时出错

使用python和psycopg2将CSV导入postgres时出错,python,postgresql,csv,psycopg2,Python,Postgresql,Csv,Psycopg2,我尝试使用python和psycopg2将一个CSV文件从文件夹复制到postgres表,结果出现以下错误: Traceback (most recent call last): File "<stdin>", line 1, in <module> psycopg2.ProgrammingError: must be superuser to COPY to or from a file HINT: Anyone can COPY to stdout or fr

我尝试使用python和psycopg2将一个CSV文件从文件夹复制到postgres表,结果出现以下错误:

 Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 psycopg2.ProgrammingError: must be superuser to COPY to or from a file
HINT:  Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.
我仍然得到上面的错误。我尝试了\copy命令,但这只适用于psql。为了能够通过我的python脚本执行此操作,有什么替代方案

已编辑

在浏览了@Ilja Everilä提供的链接后,我尝试了以下方法:

cur.copy_from('/tmp/tmpJopiUG/downloaded_xls.csv', 'test_copy')
我得到一个错误:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: argument 1 must have both .read() and .readline() methods
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:参数1必须同时具有.read()和.readline()方法
如何给出这些方法?

尝试使用:


您必须用python打开该文件并将其传递给psycopg,然后psycopg将其转发给postgres的stdin。由于您使用的是
CSV
参数
COPY
,因此必须使用专家版,您可以自己传递COPY语句。

您也可以使用COPY\u from。请参见下面的代码

with open('/tmp/tmpJopiUG/downloaded_xls.csv') as f:
 cur.copy_from(f, table_name,sep=',')
conn.commit()

看看or,它似乎使用了标准输入法和标准输出法,这将允许普通数据库用户运行它。谢谢。请看编辑。那当然不是命中注定的。我希望您注意到我的编辑,我将调用
execute()
修改为
copy\u expert()
(有一点复制粘贴错误)。但是,它真的不应该出错。是的。编辑后,我没有得到分段错误。但实际上什么也没发生。没有错误或警告,但csv仍然没有上传。记住。哦,伙计!非常感谢!他成功了!我总是忘了我需要提交更改。我强烈建议,将来你必须编写更少的样板文件。
constr = "dbname='db_name' user='user' host='localhost' password='pass'"
conn = psycopg2.connect(constr)
cur = conn.cursor()
sqlstr = "COPY test_2 FROM STDIN DELIMITER ',' CSV"
with open('/tmp/tmpJopiUG/downloaded_xls.csv') as f:
    cur.copy_expert(sqlstr, f)
conn.commit()
with open('/tmp/tmpJopiUG/downloaded_xls.csv') as f:
 cur.copy_from(f, table_name,sep=',')
conn.commit()