通过Python将CSV推送到PostgreSQL(特殊字符)

2024-04-29 01:14:41 发布

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

我正在尝试一些概念上非常简单但在细节上却很困难的东西。我想拉入通用CSV文件(包含可能包含特殊字符的字段)并通过Python PyGreSQL库将它们推送到PostgreSQL。你知道吗

问题是带有特殊字符(如“'”的字段以双引号“”形式导入,如下所示:

INSERT INTO tester VALUES ('08/09/2018 11:13', 'EMP944274823', "T'Challa", '0', "T'Challa ", 'CPY703661946', 'Prostetnic Vogon Jeltz', 'BUY', 'BK18266', 'P514605140', 'Tele Pyschic Helmets', '74', '475', '35150')

但是,手动执行以下操作时效果良好:

INSERT INTO tester VALUES ('08/09/2018 11:13', 'EMP944274823', 'T''Challa', '0', 'T''Challa ', 'CPY703661946', 'Prostetnic Vogon Jeltz', 'BUY', 'BK18266', 'P514605140', 'Tele Pyschic Helmets', '74', '475', '35150')

PyGreSQL命令执行要求所有字段使用单引号,并用双撇号表示字符串中的字符。你知道吗

即上面的“T'Challa”需要转换为“T'Challa”。你知道吗

从目前的情况来看,它并不认可这种格式。你知道吗

任何帮助都将不胜感激!你知道吗

我尝试过在引号中搜索和替换(在字符串中搜索似乎都找不到引号,所以我不确定如何处理引号(尝试了以下方法):

query.replace('"','''')
query.replace('"',"\'")
query.replace('"',"'")

等等

),使用导入选项quotechar和quoting。你知道吗

尝试几个映射步骤:

    for row in reader:
        row_new = map(lambda x: str.replace(x, "'", "''"), row)
        row_new2 = map(lambda y: str.replace(y,'"',"'"), row_new)
        query = ('INSERT INTO %s VALUES %r' %(table_name,tuple(row_new2)))

让我走到一半,把双-'放在适当的地方,但第二张地图似乎没有改变什么:

INSERT INTO tester VALUES ('10/09/2018 10:10', 'EMP944274823', "T''Challa", '0', "T''Challa ",...

我也尝试过通过Pandas导入数据帧,但结果是一样的。你知道吗

如上所述,我使用PyGreSQL库来推送csv的各个行。它运行良好,直到遇到上述违规线路。你知道吗


from pgdb import connect

dbxl = connect(dbname=user_db,user="postgres", password="MY_SECRET",host="XXX.XX.XX.XXX", port=6667)
cursor = dbxl.cursor()

with open('/home/postgres/PYSTARTERENV/example.csv', 'rt',encoding="utf8") as csvfile:
    reader = csv.reader(csvfile,quotechar="'")

    for row in reader:
        query = ('INSERT INTO %s VALUES %r' %(table_name,tuple(row)))
        cursor.execute(query)

错误反馈如下。你知道吗

回溯(最近一次呼叫): “文件”迭代_测试.py“,第57行,in 游标.执行(查询) 文件“/home/postgres/PYSTARTERENV/lib/python3.6/site-packages/pgdb.py公司,第1037行,执行中 返回自我执行(操作,[参数]) 文件“/home/postgres/PYSTARTERENV/lib/python3.6/site-packages/pgdb.py公司,第1062行,在executemany中 行=自身_src.execute命令(sql) 编程错误:错误:列“T'Challa”不存在 第1行:…酯值('08/09/2018 08:56','EMP944274823','T'Challa“。。。你知道吗


Tags: 文件inpostgresqueryreplace引号readerrow
1条回答
网友
1楼 · 发布于 2024-04-29 01:14:41

您可以使用查询和python将csv直接导入表中。假设您已经在DB和py脚本之间建立了一个连接,下面的步骤应该可以实现。你知道吗

cursor.execute("COPY table_name FROM ‘/path_to_csv_file.csv’ WITH FORMAT csv")
db.commit()

或者

cursor.execute("COPY table_name FROM '/path_to_csv_file.csv' DELIMITERS ',' CSV")
db.commit()

source

相关问题 更多 >