最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實現(xiàn)連接FTP并下載文件夾

 更新時間:2022年03月09日 08:29:16   作者:掙扎的藍藻  
這篇文章主要為大家介紹了如何利用Python實現(xiàn)鏈接FTP服務器,并下載相應的文件夾,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下

第一章:連接 FTP 服務器并實現(xiàn)文件夾下載

① 連接 FTP 服務器

如果 FTP 不用用戶名密碼就直接可以訪問,那就是用的默認用戶名 Anonymous,密碼為空。

# -*- coding: UTF8 -*-
# 2022-3-8
# 作者:小藍棗
# python連接ftp服務器
from ftplib import FTP

def conn_ftp():
    '''
     作用:連接ftp服務器
     參數(shù):無
     返回: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() 返回結(jié)果的結(jié)尾會默認帶個 None,目錄下沒有內(nèi)容的話直接會返回個 None。

def display_dir(ftp, path):
    '''
     作用:進入并展示指定的目錄內(nèi)容
     參數(shù)1:ftp連接對象
     參數(shù)2:要展示的目錄
     返回:無
    '''
    
    # 進入指定目錄
    ftp.cwd(path)
    # 顯示當前所在位置
    print("當前所在位置為:")
    print(ftp.pwd())
    # 展示目錄內(nèi)容
    print("\n顯示目錄內(nèi)容:")
    print(ftp.dir())
    # 展示目錄下的文件名,*文件夾和文件都會顯示
    print("\n文件和文件夾名為:")
    for i in ftp.nlst():
        print(i)

path = "/CaseData/nc.vo.sdp.testcase.testcase.TestcaseHVO/"
display_dir(ftp, path)

這是原始目錄。

③ 區(qū)分文件和文件夾名

從上面方法 ftp.dir() 返回結(jié)果可以看到包含 <DIR> 標識的為文件夾,我們根據(jù)這個特征來進行文件夾區(qū)分。

def diff_dir(ftp, path):
    '''
     作用:區(qū)分文件和文件夾
     參數(shù)1:ftp連接對象
     參數(shù)2:要展示的目錄
     返回:無
    '''
    
    # 進入指定目錄
    ftp.cwd(path)
    # 顯示當前所在位置
    print("當前所在位置為:")
    print(ftp.pwd())
    # 展示目錄內(nèi)容
    print("\n顯示目錄內(nèi)容:")
    dirs = []
    ftp.dir(".", dirs.append)
    for i in dirs:
        # 區(qū)分文件和文件夾
        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):
    '''
     作用:需要文件或文件夾名
     參數(shù)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

# 測試兩條數(shù)據(jù)
get_dir_name("03-08-22  09:52AM       <DIR>          C2021.11_ZDHJC_004a")
get_dir_name("03-08-25  10:32AM                89098 hello .exe")

⑤ 使用遞歸實現(xiàn):FTP服務器里的文件夾下載到本地

思路:

首先是看目錄或文件里是否包含關(guān)鍵詞,包含關(guān)鍵詞進行下載。

并判斷是否是目錄,如果是目錄的話,本地根據(jù)目錄結(jié)構(gòu)進行遞歸,同時本地創(chuàng)建文件夾。

使用了 2 個方法,下面的方法用來判斷是否包含關(guān)鍵詞,上面的方法就是目錄結(jié)構(gòu)下的遞歸。

注意:由于是一個 ftp 連接對象,遞歸過程中進去某個目錄下,遞歸結(jié)束要回到之前的目錄。

import pathlib

def download_dir(ftp, path, local_path):
    '''
     作用: 下載目錄
     參數(shù)1:ftp連接對象
     參數(shù)2:要展示的目錄
     參數(shù)3:本地存放路徑
     返回:無
    '''
    
    # 進入指定目錄
    ftp.cwd(path)
    # 區(qū)分文件和文件夾
    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
                # 本地創(chuàng)建文件夾
                pathlib.Path(local_path_new).mkdir(parents=True, exist_ok=True)
                # 調(diào)用下載目錄方法
                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):
    '''
     作用: 根據(jù)關(guān)鍵詞下載文件
     參數(shù)1:ftp連接對象
     參數(shù)2:下載的關(guān)鍵詞
     參數(shù)3:要展示的目錄
     參數(shù)4:本地存放路徑
     返回:無
    '''
    
    # 進入指定目錄
    ftp.cwd(path)
    # 區(qū)分文件和文件夾
    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
                    # 本地創(chuàng)建文件夾
                    pathlib.Path(local_path_new).mkdir(parents=True, exist_ok=True)
                    # 調(diào)用下載目錄方法
                    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)

# 設(shè)置編碼,解決上傳的文件包含中文的問題
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)

可以看到符合關(guān)鍵詞的目錄被下載到本地了。

并且里面的嵌套目錄也同步被下載了。

第二章:問題解決

① 下載的文件名包含中文【‘utf-8’ codec can’t decode byte …】

設(shè)置下 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實現(xiàn)連接FTP并下載文件夾的詳細內(nèi)容,更多關(guān)于Python FTP下載文件夾的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 關(guān)于阿里云oss獲取sts憑證 app直傳 python的實例

    關(guān)于阿里云oss獲取sts憑證 app直傳 python的實例

    今天小編就為大家分享一篇關(guān)于阿里云oss獲取sts憑證 app直傳 python的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Django 導出 Excel 代碼的實例詳解

    Django 導出 Excel 代碼的實例詳解

    本篇文章主要介紹了Django 導出 Excel 代碼的實例詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • python定時任務sched庫用法簡單實例

    python定時任務sched庫用法簡單實例

    sched可用于定時任務,唯一需要注意的就是,這些任務在一個線程中運行,如果前面的任務耗時過長,則后面的任務將順延執(zhí)行,下面這篇文章主要給大家介紹了關(guān)于python定時任務sched庫用法的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • 利用Python實現(xiàn)熱力圖的繪制

    利用Python實現(xiàn)熱力圖的繪制

    熱力圖,是一種通過對色塊著色來顯示數(shù)據(jù)的統(tǒng)計圖表。繪圖時,需指定顏色映射的規(guī)則。本文主要用Python來實現(xiàn)熱力圖的制作,需要的可以參考一下
    2022-09-09
  • Python類的常用高級函數(shù)匯總

    Python類的常用高級函數(shù)匯總

    這篇文章主要介紹了Python類的常用高級函數(shù)匯總,文章圍繞python類函數(shù)展開詳細內(nèi)容,具有一的的參考價值,需要的小伙伴可以參考一下,希望對你的學習有所幫助
    2022-03-03
  • Python字典fromkeys()方法使用代碼實例

    Python字典fromkeys()方法使用代碼實例

    這篇文章主要介紹了Python字典fromkeys()方法使用代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • Python 實例方法、類方法、靜態(tài)方法的區(qū)別與作用

    Python 實例方法、類方法、靜態(tài)方法的區(qū)別與作用

    Python中至少有三種比較常見的方法類型,即實例方法,類方法、靜態(tài)方法。它們是如何定義的呢?如何調(diào)用的呢?它們又有何區(qū)別和作用呢?感興趣的朋友跟隨小編一起看看吧
    2019-08-08
  • Python字符串常用方法以及其應用場景詳解

    Python字符串常用方法以及其應用場景詳解

    本人學習python時的總結(jié),并不需要記住,知道有這個方法,拿起來用就行,下面這篇文章主要給大家介紹了關(guān)于Python字符串常用方法以及其應用場景的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • 解決pyinstaller打包運行程序時出現(xiàn)缺少plotly庫問題

    解決pyinstaller打包運行程序時出現(xiàn)缺少plotly庫問題

    這篇文章主要介紹了解決pyinstaller打包運行程序時出現(xiàn)缺少plotly庫問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • python3.6+opencv3.4實現(xiàn)鼠標交互查看圖片像素

    python3.6+opencv3.4實現(xiàn)鼠標交互查看圖片像素

    這篇文章主要為大家詳細介紹了python3.6+opencv3.4實現(xiàn)鼠標交互查看圖片像素,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02

最新評論

丰城市| 饶平县| 鄯善县| 麻城市| 湘潭市| 寻乌县| 德安县| 建宁县| 柘荣县| 法库县| 土默特左旗| 台安县| 红桥区| 甘肃省| 屏东市| 久治县| 石河子市| 隆林| 德格县| 灵山县| 赣榆县| 会宁县| 泽库县| 大新县| 普兰店市| 马龙县| 德惠市| 石阡县| 博罗县| 中阳县| 大新县| 兰坪| 平阴县| 洛隆县| 阿城市| 韩城市| 萝北县| 武城县| 呈贡县| 广平县| 南靖县|