ftplib中有一個方法是cwd,用來切換目錄,需要傳入一個dirname,經過個人測試,該dirname不能含有漢字,會拋出:UnicodeEncodeError: 'latin-1' codec can't encode characters 類型的錯誤。
在google中搜索,stackflow網站有大量類似的問題和解決方法,常見的是因為utf-8和latin-1無法一一對應,一般將字符串encode為utf-8而后decode為cp1252的方案來解決,但是我按照這種方法來做,卻無法解決cwd的錯誤問題(dirname.encode().decode('cp1252')).我相信利用編碼的轉化是可以解決的,但是我還沒有找到。如果有哪位前輩知道如何解決,望請指導告知,謝謝!
而后,利用了一個笨的方法去改變,即:首先正常的ftp.login,然后 利用retrlines('LIST') 方法列出目錄,手動復制漢字編碼轉換后的目錄,而后將其作為dirname的值傳入到cwd中,由此完成切換目錄的工作。如果有人遇到同樣的問題,也許可以嘗試。
from ftplib import FTP from os.path import exists from getpass import getpass #getpass是彈出一個輸入密碼的窗口 def getfile(file,site,dirname,usr=(),*,verbose = True,refetch = False): if exists(file) and not refetch: if verbose:print(file,' already feteched.') else: if verbose:print('Downloading... ',file) local = open(file,'wb') try: ftp = FTP(site) ftp.login(*user) ftp.cwd(dirname) print('Current directory:',ftp.pwd()) ftp.retrlines('LIST') ftp.retrbinary('RETR '+file,local.write,1024) ftp.quit() finally: local.close() if verbose: print('Download Done!') if __name__=='__main__': file = 'myhongze.jpg' dirname = './ÏîÄ¿×é³ÉԱ˽È˿ռä/zgcao/test-python/' site = '************' user = ('zhigang',getpass('Input Pwd:')) getfile(file,site,dirname,user,refetch=True) #在dirnmae直接輸入漢字的時候會出現問題,會爆出“UnicodeEncodeError: 'latin-1' codec can't encode characters”的錯誤,這個查詢主要是編碼的問題,decode為cp1252和latin-1都 #無法解決,最后利用ftp.retrlines('LIST')列出漢字的目錄,然后復制附錄,最后進行處理。