亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

pandas to_sql 為具有 JSON 列的表提供 UnicodeEncodeError

pandas to_sql 為具有 JSON 列的表提供 UnicodeEncodeError

拉莫斯之舞 2023-07-18 13:35:40
前言:我知道有關此主題的類似問題,并嘗試了他們的解決方案,但無濟于事。我正在創建一個 python 腳本來從 ftp 地址獲取 JSON 文件,將其轉換為 Pandas 數據幀,然后將其發送到 MySQL 以填充表。但是,我遇到了 Pandas.to_sql 的問題。錯誤是:UnicodeEncodeError: 'ascii' codec can't encode character '\xd1' in position 87: ordinal not in range(128)這是我的代碼:import pandas as pdimport jsonfrom sqlalchemy import create_enginecnx = create_engine('mysql://username:[email protected]/database?charset=utf8',encoding='utf-8')sl1 = pd.read_json('ftp://username:[email protected]/directory/sailings_cel.txt')sl1 = pd.json_normalize(sl1["Dataset"])sl1.to_sql(name='celsailingtemp',con=cnx,if_exists='append',index=True)可能有用的信息:我已經嘗試了多種排列,以確保在 create_engine 語句中將編碼設置為 utf-8,按照 StackOverflow 上的類似問題。JSON 文件在 FTP 服務器上提供,擴展名為 .txt,但我認為應該沒問題,因為它由 read_json 和 json_normalize 處理得很好。根據https://www.utf8-chartable.de/unicode-utf8-table.pl?unicodeinhtml=hex,看起來 xd1 可能是 ? 字符。果然,在行程欄里就能找到違規角色。說到列,JSON 數據結構如下所示。將 json_normalize 級別設置為“數據集”會將嵌套的“行程”列降級為長字符串,這對我來說沒問題。我已在 mysql 端將該列的類型設置為“JSON”。MySQL 表結構如下所示:我可能可以簡單地刪除行程列,但核心編碼問題不會得到解決,我想正確執行此操作。任何有關此問題的指導將不勝感激!
查看完整描述

3 回答

?
幕布斯6054654

TA貢獻1876條經驗 獲得超7個贊

json_normalize level ...將嵌套的“行程”列降級為長字符串


事實上不,事實并非如此。該列包含一個列表(或者可能是一個 Series 對象),這使 DBAPI 驅動程序感到困惑。為了讓它工作,我必須這樣做:


sl1 = pd.read_json(r"C:\Users\Gord\Desktop\sailing.json")

sl1 = pd.json_normalize(sl1["Dataset"])

sl1["MarketName"] = sl1["MarketName"].map(lambda x: json.dumps(x))

sl1["MarketNameList"] = sl1["MarketNameList"].map(lambda x: json.dumps(x))

sl1["Itinerary"] = sl1["Itinerary"].map(lambda x: json.dumps(x))


sl1.to_sql(name="celsailingtemp", con=cnx, if_exists="append", index=True)


查看完整回答
反對 回復 2023-07-18
?
慕標琳琳

TA貢獻1830條經驗 獲得超9個贊

我認為你的ftp傳輸是通過ascii進行的。將 ftp 設置為使用二進制模式。

sl1 = pd.read_json('ftp://username:[email protected]/directory/sailings_cel.txt;type=I')

我看到你的回溯,似乎是python編碼問題,而不是MySQL。設置使用utf-8。

  1. python編碼 在執行之前設置python編碼。

export PYTHONIOENCODING=utf-8
  1. OS編碼確認utf-8編碼類型,執行locale -a命令。

# locale -a
C
C.UTF-8
POSIX

如果有C.UTF-8,請設置C.UTF-8。

export LC_CTYPE="C.UTF-8"


查看完整回答
反對 回復 2023-07-18
?
墨色風雨

TA貢獻1853條經驗 獲得超6個贊

看起來您可以更改數據庫中列的字符集,這應該使您的代碼運行良好。

順便說一句,處理此類問題的另一種方法是將數據的子集重新創建為小提琴并在那里使用它。


查看完整回答
反對 回復 2023-07-18
  • 3 回答
  • 0 關注
  • 171 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號