我需要使用 Python 自動將 Excel 文件導入到 PostgreSQL 中。我對 Python 比較陌生,但設法自動創(chuàng)建表?,F在我陷入了將數據導入表的困境。我遇到的問題是在 PostgreSQL 中我已將某些列定義為日期列。但是,許多“日期”列還沒有任何數據。因此它被標記為nan。但是,psycopg2 不喜歡 nan 作為日期列的值,而是期望為空。當將列表轉換為字符串(應傳遞到 )時INSERT INTO {sheet} VALUES ({formatted_data_string}),我相信表的各個條目應該在看起來像這樣的字符串中:'data', 'data', 'data', null, 'data'下面的代碼從 Excel 文件獲取數據,然后創(chuàng)建 formatted_data_string應該插入到 SQL 語句中。 def import_data(path): xl = pd.ExcelFile(path) sheets = xl.sheet_names conn = psycopg2.connect(host=host, port=port, database=database, user=user, password=password) cur = conn.cursor() sheet_column_names = [] for sheet in sheets: if sheet == 'ReadMe': continue df = pd.read_excel(xl, sheet) list_of_rows = df.to_numpy().tolist() for entry in list_of_rows: if entry == list_of_rows[0]: continue formatted_data = [] for element in entry: if element == 'nan': formatted_data.append('null') else: formatted_data.append(f"'{element}'") formatted_data_str = ','.join(str(element) for element in formatted_data) print(formatted_data_str)幾乎所有數據的格式都正確,除了“nan”值仍然顯示為“nan”而不是null我所期望的。我多次檢查了代碼,但不明白為什么它不將 nan 替換為 null。這是我當前從此代碼中獲取的 formatted_data_str 的示例: '25...1','Something','XX','XX','[relToChild, relToParent]','Some Other Data','2018-10-09 06:04:28.015000','nan','1','DISABLED','nan',...這段代碼有問題嗎?或者我是否遺漏了一些明顯的東西來將 nan 替換為不帶引號的 null ?
1 回答
收到一只叮咚
TA貢獻1821條經驗 獲得超5個贊
所以我找到了一個解決我的問題的方法,效果很好。使用以下命令創(chuàng)建第二個 DataFrame 會將所有 nan 替換為 None。
df = pd.read_excel(xl, sheet)
df1 = df.where(pd.notnull(df), None)
然后,這允許我使用 For 循環(huán)來定位 None,用 null 替換所有 None。在數據對象周圍添加第二個單引號。
for element in entry:
if element != None:
formatted_data.append(f"'{element}'")
continue
else:
formatted_data.append('null')
使用將新列表(formatted_data)轉換為字符串后
formatted_data_str = ','.join(str(element) for element in formatted_data)
生成的字符串采用我上面解釋的所需格式。服務器接受 SQL 語句,并且 PostgreSQL 數據庫中的數據似乎是正確的。我知道這可能不是最好的解決方案,但它對我有用,這就是我現在所需要的。
添加回答
舉報
0/150
提交
取消
