<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
如果 FTP 不用使用者名稱密碼就直接可以存取,那就是用的預設使用者名稱 Anonymous,密碼為空。
# -*- coding: UTF8 -*- # 2022-3-8 # 作者:小藍棗 # python連線ftp伺服器 from ftplib import FTP def conn_ftp(): ''' 作用:連線ftp伺服器 引數:無 返回:ftp伺服器連線的物件 ''' # FTP連線資訊 ftp_ip = "xx.xx.xx.xx" # 預設埠21 ftp_port = 21 # 如果未指定,使用預設使用者名稱為Anonymous,密碼為空 ftp_user = "Anonymous" ftp_password = "" ftp = FTP() # 連線ftp ftp.connect(ftp_ip, ftp_port) # ftp登入 ftp.login(ftp_user, ftp_password) # 檢視歡迎資訊 print(ftp.getwelcome()) return ftp ftp = 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 = 0 record = "" for i in s: if(record == " " and i != " "): k = k + 1; if(k >= 3): dir_name = dir_name + i; record = i print(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")
思路:
首先是看目錄或檔案裡是否包含關鍵詞,包含關鍵詞進行下載。
並判斷是否是目錄,如果是目錄的話,本地根據目錄結構進行遞迴,同時本地建立資料夾。
使用了 2 個方法,下面的方法用來判斷是否包含關鍵詞,上面的方法就是目錄結構下的遞迴。
注意:由於是一個 ftp 連線物件,遞迴過程中進去某個目錄下,遞迴結束要回到之前的目錄。
import pathlib def 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_name f = 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_name f = 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下載資料夾的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45