psycopg2 copy_expert() - 如何在gzip压缩的csv文件中复制?

时间:2016-12-29 23:19:02

标签: 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=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文件。

已添加1240-16 0940 MST - 回复评论: 试图让COPY声明正确,但所有这些错误---

this_file = "staging.tbl_testcopy.csv.gz"
this_copy_01 = '''COPY staging.tbl_testcopy_tmp FROM STDIN'''
this_copy_02 = '''COPY staging.tbl_testcopy_tmp FROM %s'''
this_copy_03 = '''COPY staging.tbl_testcopy_tmp FROM (%s)'''
this_copy_04 = '''COPY staging.tbl_testcopy_tmp FROM f'''

with gzip.open(this_file, 'rb') as f:
    try:
        cur.copy_expert(this_copy_01, f)
    except Exception, e:
        print e
    try:
        cur.copy_expert(this_copy_02, f)
    except Exception, e:
        print e
    try:
        cur.copy_expert(this_copy_03, f)
    except Exception, e:
        print e
    try:
        cur.copy_expert(this_copy_04, f)
    except Exception, e:
        print e

所有这些错误,在同一个地方。那么 应该 来自' 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
                                           ^

1 个答案:

答案 0 :(得分:1)

copy_expert的{​​{1}}参数应该是类似对象的文件,而不是文件名。对于常规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语句。有关详细信息,请参阅https://docs.djangoproject.com/en/1.10/topics/auth/default/#authentication-in-web-requests文档。使用COPY(具有可选的sep参数)而不是copy_expert可能更容易。

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

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