Python的Ftplib問題:UnicodeEncodeError: 'latin-1' codec can't encode characters的解決方法


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')列出漢字的目錄,然后復制附錄,最后進行處理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM