[英]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,在執行返回self.executemany(操作,[參數])文件“/home/postgres/PYSTARTERENV/lib/python3.6/site-packages/pgdb.py”,第1062行,在executemany rows = self._src中。執行(sql)pg.ProgrammingError:錯誤:列“T'Challa”不存在LINE 1:...酯VALUES('08 / 09/2018 08:56','EMP944274823',“T'Challa”.. 。
您可以使用查詢和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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.