Python 连接FTP服务器并实现文件夹下载实例演示,python区分ftp目录下文件和文件夹方法,ftp目录下包含中文名问题处理
Python 連接 FTP 服務器并實現文件夾下載實例演示
- 第一章:連接 FTP 服務器并實現文件夾下載
- ① 連接 FTP 服務器
- ② 進入指定目錄并顯示文件信息
- ③ 區分文件和文件夾名
- ④ 文件夾名包含空格處理
- ⑤ 使用遞歸實現:FTP服務器里的文件夾下載到本地
- 第二章:問題解決
- ① 下載的文件名包含中文【'utf-8' codec can't decode byte ...】
- ② 指定的路徑存在問題【550 The system cannot find the file specified.】
- ③ 下載文件前未加RETR標識【500 Command not understood.】
[ 推薦文章 ]
Python 地圖篇 - 使用 pyecharts 繪制世界地圖、中國地圖、省級地圖、市級地圖實例詳解
第一章:連接 FTP 服務器并實現文件夾下載
① 連接 FTP 服務器
如果 FTP 不用用戶名密碼就直接可以訪問,那就是用的默認用戶名 Anonymous,密碼為空。
# -*- coding: UTF8 -*- # 2022-3-8 # 作者:小藍棗 # python連接ftp服務器 from ftplib import FTPdef conn_ftp():'''作用:連接ftp服務器參數:無返回:ftp服務器連接的對象'''# FTP連接信息ftp_ip = "xx.xx.xx.xx"# 默認端口21ftp_port = 21# 如果未指定,使用默認用戶名為Anonymous,密碼為空ftp_user = "Anonymous"ftp_password = ""ftp = FTP()# 連接ftpftp.connect(ftp_ip, ftp_port)# ftp登錄ftp.login(ftp_user, ftp_password)# 查看歡迎信息print(ftp.getwelcome())return ftpftp = conn_ftp()② 進入指定目錄并顯示文件信息
方法 ftp.dir() 返回結果的結尾會默認帶個 None,目錄下沒有內容的話直接會返回個 None。
def display_dir(ftp, path):'''作用:進入并展示指定的目錄內容參數1:ftp連接對象參數2:要展示的目錄返回:無'''# 進入指定目錄ftp.cwd(path)# 顯示當前所在位置print("當前所在位置為:")print(ftp.pwd())# 展示目錄內容print("\n顯示目錄內容:")print(ftp.dir())# 展示目錄下的文件名,*文件夾和文件都會顯示print("\n文件和文件夾名為:")for i in ftp.nlst():print(i)path = "/CaseData/nc.vo.sdp.testcase.testcase.TestcaseHVO/" display_dir(ftp, path)這是原始目錄。
③ 區分文件和文件夾名
從上面方法 ftp.dir() 返回結果可以看到包含 <DIR> 標識的為文件夾,我們根據這個特征來進行文件夾區分。
def diff_dir(ftp, path):'''作用:區分文件和文件夾參數1:ftp連接對象參數2:要展示的目錄返回:無'''# 進入指定目錄ftp.cwd(path)# 顯示當前所在位置print("當前所在位置為:")print(ftp.pwd())# 展示目錄內容print("\n顯示目錄內容:")dirs = []ftp.dir(".", dirs.append)for i in dirs:# 區分文件和文件夾if("<DIR>" in i):print("目錄為:" + i.split(" ")[-1])else:print("文件為:" + i.split(" ")[-1])path = "/CaseData/nc.vo.sdp.testcase.testcase.TestcaseHVO/" diff_dir(ftp, path)④ 文件夾名包含空格處理
split(" ")[-1] 方法有個缺陷,如果文件或文件夾名里包含空格,得到到的文件夾名就不對了,下面的方法可以有效的解決這個問題
def get_dir_name(s):'''作用:需要文件或文件夾名參數1:需要截取的字符串返回:文件或文件夾名'''dir_name = ""k = 0record = ""for i in s:if(record == " " and i != " "):k = k + 1;if(k >= 3):dir_name = dir_name + i;record = iprint(dir_name)return dir_name# 測試兩條數據 get_dir_name("03-08-22 09:52AM <DIR> C2021.11_ZDHJC_004a") get_dir_name("03-08-25 10:32AM 89098 hello .exe")⑤ 使用遞歸實現:FTP服務器里的文件夾下載到本地
思路:
首先是看目錄或文件里是否包含關鍵詞,包含關鍵詞進行下載。
并判斷是否是目錄,如果是目錄的話,本地根據目錄結構進行遞歸,同時本地創建文件夾。
使用了 2 個方法,下面的方法用來判斷是否包含關鍵詞,上面的方法就是目錄結構下的遞歸。
注意:由于是一個 ftp 連接對象,遞歸過程中進去某個目錄下,遞歸結束要回到之前的目錄。
import pathlibdef download_dir(ftp, path, local_path):'''作用: 下載目錄參數1:ftp連接對象參數2:要展示的目錄參數3:本地存放路徑返回:無'''# 進入指定目錄ftp.cwd(path)# 區分文件和文件夾dirs = []ftp.dir(".", dirs.append)for i in dirs:try:# 識別為目錄進行遞歸if("<DIR>" in i):dir_name = get_dir_name(i)local_path_new = local_path + "/" + dir_name# 本地創建文件夾pathlib.Path(local_path_new).mkdir(parents=True, exist_ok=True)# 調用下載目錄方法download_dir(ftp, dir_name, local_path_new)# 識別為文件進行下載else:file_name = get_dir_name(i)local_filename = local_path + "/" + file_namef = open(local_filename, "wb")# 下載ftp文件ftp.retrbinary('RETR ' + file_name, f.write)f.close()except Exception as e:print(e)# 退出當前目錄ftp.cwd("..")def download_file(ftp, key, path, local_path):'''作用: 根據關鍵詞下載文件參數1:ftp連接對象參數2:下載的關鍵詞參數3:要展示的目錄參數4:本地存放路徑返回:無'''# 進入指定目錄ftp.cwd(path)# 區分文件和文件夾dirs = []ftp.dir(".", dirs.append)for i in dirs:if(key in i):try:# 識別為目錄進行遞歸if("<DIR>" in i):dir_name = get_dir_name(i)local_path_new = local_path + "/" + dir_name# 本地創建文件夾pathlib.Path(local_path_new).mkdir(parents=True, exist_ok=True)# 調用下載目錄方法download_dir(ftp, dir_name, local_path_new)else:file_name = get_dir_name(i)local_filename = local_path + "/" + file_namef = open(local_filename, "wb")# 下載ftp文件ftp.retrbinary('RETR ' + file_name, f.write)f.close()except Exception as e:print(e)# 設置編碼,解決上傳的文件包含中文的問題 ftp.encoding = 'GBK' key = "C2021.11_ZDHJC" path = "/CaseData/nc.vo.sdp.testcase.testcase.TestcaseHVO/" local_path = "D:/ftp下載" download_file(ftp, key, path, local_path)可以看到符合關鍵詞的目錄被下載到本地了。
并且里面的嵌套目錄也同步被下載了。
第二章:問題解決
① 下載的文件名包含中文【‘utf-8’ codec can’t decode byte …】
設置下 FTP 對象的編碼為 GBK 即可。
ftp.encoding = 'GBK'
不然會報如下錯誤:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd7 in position 114: invalid continuation byte
② 指定的路徑存在問題【550 The system cannot find the file specified.】
開始我用 split(" ")[-1] 方法截取文件名,由于有的文件含有中文,截取后的文件名稱不對了。
就報了 ftplib.error_perm: 550 The system cannot find the file specified. 的錯誤。
③ 下載文件前未加RETR標識【500 Command not understood.】
下載文件時 FTP 路徑前要加個 'RETR ',不然就會報 500 錯誤,注意后面還跟了個空格。
# 下載ftp文件 ftp.retrbinary('RETR ' + file_name, f.write)不然就報 ftplib.error_perm: 500 Command not understood. 錯誤了。
喜歡的點個贊?吧!
總結
以上是生活随笔為你收集整理的Python 连接FTP服务器并实现文件夹下载实例演示,python区分ftp目录下文件和文件夹方法,ftp目录下包含中文名问题处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PyQt5 图形界面 - 配置界面跟随窗
- 下一篇: 每日一练:Python代码绘制航海王草帽