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

Pushing CSV to PostgreSQL via Python (special characters)

我正在尝试一些概念上非常简单但在细节上证明很困难的事情。我想提取通用 CSV 文件(带有可能包含特殊字符的字段)并通过 Python PyGreSQL 库将它们推送到 PostgreSQL。

麻烦的是,带有特殊字符(例如“'”)的字段在双引号“”中导入,如下面的 T'Challa 所示:

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 和引用。

正在尝试几个映射步骤:

    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)

返回的错误如下。

回溯(最后一次调用): 文件 "iteration_test.py",第 57 行,位于 cursor.execute(查询) 文件“/home/postgres/PYSTARTERENV/lib/python3.6/site-packages/pgdb.py”,第 1037 行,在执行中 return self.executemany(操作, [参数]) 文件“/home/postgres/PYSTARTERENV/lib/python3.6/site-packages/pgdb.py”,第 1062 行,在 executemany 中 行数 = self._src.execute(sql) pg.ProgrammingError:错误:列 "T'Challa" 不存在 第 1 行:...ester VALUES ('08/09/2018 08:56', 'EMP944274823', "T'Challa"...

您可以使用查询和 python 将 csv 直接导入 table。假设您已经在数据库和 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