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

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

嘗試使用 ftplib 和 storbinary ==> UnicodeEncodeError

嘗試使用 ftplib 和 storbinary ==> UnicodeEncodeError

忽然笑 2022-06-14 17:32:52
我的代碼存在以下問題:我正在嘗試將“png”圖像存儲到 FTP 服務器(網站的屏幕截圖)中。我正在使用 ftplib 和 selenium(使用 webdriver):driver.get(<someURL>)screenshot = driver.save_screenshot(driver.title + '.png')ftp.storbinary("STOR <PathToServer>" + driver.title + '.png', open(driver.title + '.png', 'rb'))這種方法適用于網站是用拉丁字符編寫的,問題是圖像可能是位于泰國、中國或埃及的網站的屏幕截圖。在這種情況下,該行:open(driver.title + '.png', 'rb')返回臭名昭著的錯誤:UnicodeEncodeError: 'latin-1' codec can't encode character '\u1ec7' in position 60: ordinal not in range(256)我知道 storbinary 只接受二進制數(正如該方法的名稱所暗示的那樣)。但是,我不明白的是如何“編碼” png 以使其不會導致該錯誤,從而可以成功地將其存儲到 FTP 服務器中。非常感謝你!任何幫助、評論或見解,將不勝感激。最好的!
查看完整描述

1 回答

?
繁花不似錦

TA貢獻1851條經驗 獲得超4個贊

事實是在運行的計算機程序中表示的文本和存儲在文件中的文本,文件名和數據庫是兩個不同的東西。人們可以將前者視為一組字符,而不必關心它們在內部是如何表示的。另一方面,要將文本存儲在文件系統 DB 中,通過網絡傳輸,文本必須以字節表示。這種將程序運行時擁有的“純”文本轉換為字節表示的過程稱為“編碼”。為了更好地理解這一點,我建議閱讀這篇文章。


Python 3,無論是核心語言還是庫,在對文本進行任何 I/O 時都會嘗試自動選擇正確的文本編碼。在您的情況下,它為目標服務器中的文件名選擇了“latin1”編解碼器。


Latin1 僅限于 200 多個有效字符,不能表示大量字符或字形 - 任何非西方語言字符,甚至一些西方語言字符,例如 ?、?、?,都無法用它表示.


建議是在讓 Python 這樣做之前對名稱進行手動編碼,因為這樣我們就可以控制如何處理目標編碼中不存在的字符。由于庫方法.strobinary(


因此,為了保留 latin1 中不存在的有關您的字符的信息,我建議使用轉義編碼 - 其他選項將替換為“?” 或忽略,只是抑制所有字符:


filename = driver.title.encode("latin1", errors="xmlcharrefreplace").decode("latin1") + ".png"

screenshot = driver.save_screenshot(filename)

ftp.storbinary("STOR <PathToServer>" + filename, open(filename, 'rb'))


查看完整回答
反對 回復 2022-06-14
  • 1 回答
  • 0 關注
  • 144 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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