通过 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()
我正在尝试一些概念上非常简单但在细节上证明很困难的事情。我想提取通用 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()