簡體   English   中英

通過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,在執行返回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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM