Python psycopg2 copy_expert()-如何在Gzip csv文件中复制?

Python psycopg2 copy_expert()-如何在Gzip csv文件中复制?,python,csv,gzip,psycopg2,Python,Csv,Gzip,Psycopg2,如果我的表是schema_one.table_five,而我的文件名是file_to_import.csv.gz,为了将文件内容复制到表中,我应该给copy_expert()cmd什么参数 以下是我正在尝试的: this_copy = '''COPY schema_one.table_five FROM STDIN with CSV''' this_file = "file_to_import.csv.gz" con = psycopg2.connect(dbname=dbname, host=

如果我的表是schema_one.table_five,而我的文件名是file_to_import.csv.gz,为了将文件内容复制到表中,我应该给copy_expert()cmd什么参数

以下是我正在尝试的:

this_copy = '''COPY schema_one.table_five FROM STDIN with CSV'''
this_file = "file_to_import.csv.gz"
con = psycopg2.connect(dbname=dbname, host=host, port=port, user=user, password=password)
cur = con.cursor()

cur.copy_expert(this_copy, this_file)
这会产生一个错误:

cur.copy_expert(this_copy, this_file) 
TypeError: file must be a readable file-like object for COPY FROM; a writable file-like object for COPY TO.
那么,我如何告诉命令首先解压缩文件,然后指定一个分隔符(在本例中为“|”),以便对其进行处理呢

第二个问题。如果我的文件位于名为“files_to_import”的目录中,即/home/dir1/dir2/files_to_import/file_to_import.csv.gz,是否有一种方法可以仅指定目录并将pgm副本保存在该目录中的所有文件中(到同一个表)?它们都是.csv.gz文件


增加了12-30-16 0940 MST——作为对评论的回应: 试图获得正确的COPY语句,但所有这些都是错误的---

所有这些错误都发生在同一个地方。那么,“FROM”后面应该是什么

syntax error at or near "STDIN"
LINE 1: COPY staging.tbl_testcopy_tmp FROM STDIN
                                           ^

syntax error at or near "%"
LINE 1: COPY staging.tbl_testcopy_tmp FROM %s
                                           ^

syntax error at or near "("
LINE 1: COPY staging.tbl_testcopy_tmp FROM (%s)
                                           ^

syntax error at or near "f"
LINE 1: COPY staging.tbl_testcopy_tmp FROM f
                                           ^

copy\u expert
file
参数应该是类似文件的对象,而不是文件名。对于常规csv文件,您可以使用:

with open("file_to_import.csv",  'rb') as this_file:
    cur.copy_expert(this_copy, this_file)
对于gzip文件,您可以使用
gzip
模块打开该文件:

import gzip
with gzip.open("file_to_import.csv.gz",  'rb') as this_file:
    cur.copy_expert(this_copy, this_file)
要更改分隔符,必须更改COPY语句。有关更多信息,请参阅文档。它可能更易于使用(具有可选的
sep
参数),而不是
copy\u expert

with gzip.open("file_to_import.csv.gz",  'rb') as this_file:
    cur.copy_from(this_file, 'staging.tbl_testcopy_tmp', sep='|')

没有自动导入目录中所有文件的命令,您必须获取目录内容的列表并在其中循环。

尝试了此操作,但出现错误:
文件“/trytest\u copy.py”,cur.copy\u expert(this\u copy,sys.stdin)psycopg2中的第24行。编程错误:语法错误位于或接近“stdin”第1行:从STDIN复制schema_one.table_five,使用CSV头
您使用的
sys.STDIN
——这不是我在回答中的内容。您需要传递文件句柄。将其更改为“f”,这是文件句柄,但仍有错误。有关代码和结果,请参见上面编辑的OP。看起来FROM之后的任何内容都会导致错误(或者至少是我尝试过的所有内容)。对副本声明的正确构造有何建议?我所要做的就是从我的文件复制到我的表中。另外,我应该使用copy_from()而不是copy_expert()?我在w copy_from()上鬼混了一段时间,但一无所获。顺便说一句,目标表是AWS红移表是的,正如我在回答中所说的,可能可以使用
copy_from
而不是
copy_expert
。我无法在STDIN中的语句
COPY staging.tbl\u testcopy\u tmp中发现问题。也许
copy\u from
copy\u expert
不能使用红移。
with gzip.open("file_to_import.csv.gz",  'rb') as this_file:
    cur.copy_from(this_file, 'staging.tbl_testcopy_tmp', sep='|')