Python实现连接FTP并下载文件夹

目录
  • 第一章:连接FTP服务器并实现文件夹下载
    • ①连接FTP服务器
    • ②进入指定目录并显示文件信息
    • ③区分文件和文件夹名
    • ④文件夹名包含空格处理
    • ⑤使用递归实现:FTP服务器里的文件夹下载到本地
  • 第二章:问题解决

第一章:连接 FTP 服务器并实现文件夹下载

① 连接 FTP 服务器

如果 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")

⑤ 使用递归实现:FTP服务器里的文件夹下载到本地

思路:

首先是看目录或文件里是否包含关键词,包含关键词进行下载。

并判断是否是目录,如果是目录的话,本地根据目录结构进行递归,同时本地创建文件夹。

使用了 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下载文件夹的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python FTP文件定时自动下载实现过程解析

    这篇文章主要介绍了Python FTP文件定时自动下载实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.需求: 某数据公司每日15:00~17:00之间,在其FTP发布当日数据供下载,我方需及时下载当日数据至指定本地目录. 二.分析: 1.需实现FTP登陆.查询.下载功能: 解答:使用内置的ftplib模块中FTP类: 2.需判断文件是否下载: 解答:使用os模块中path.exists方法: 3.需判断在指定时间段内才执行下载任

  • Python使用sftp实现传文件夹和文件

    利用python的sftp实现文件上传,可以是文件,也可以是文件夹. 版本Python2.7.13 应该不用pip安装更多的插件,都是自带的 不多说 上代码 # -*- coding:utf-8 -*- import sys reload(sys) sys.setdefaultencoding('utf-8') import paramiko import os _XFER_FILE = 'FILE' _XFER_DIR = 'DIR' class MainWindow(object): # 构

  • Python实现FTP上传文件或文件夹实例(递归)

    本文实例讲述了Python实现FTP上传文件或文件夹实例.分享给大家供大家参考.具体如下: import sys import os import json from ftplib import FTP _XFER_FILE = 'FILE' _XFER_DIR = 'DIR' class Xfer(object): ''''' @note: upload local file or dirs recursively to ftp server ''' def __init__(self): s

  • Python FTP两个文件夹间的同步实例代码

    具体代码如下所示: # -*- coding: utf-8 -*- ''''''' ftp自动检测源文件夹的更新,将源文件夹更新的内容拷贝到目标文件夹中 使用树的层序遍历算法,支持深度目录拷贝 ''' import os from ftplib import FTP import os,sys,string,datetime,time import shutil import socket class MyUpdateMonitor(object): def __init__(self, hos

  • 通过python下载FTP上的文件夹的实现代码

    复制代码 代码如下: # -*- encoding: utf8 -*-import osimport sysimport ftplibclass FTPSync(object):    def __init__(self):        self.conn = ftplib.FTP('10.22.33.46', 'user', 'pass')        self.conn.cwd('/')        # 远端FTP目录        os.chdir('/data/')       

  • python实现从ftp服务器下载文件

    代码之余,将代码过程重要的一些代码段备份一下,如下的代码内容是关于Python从ftp服务器下载文件的的代码,希望能对小伙伴有用途. #coding=utf-8 ''' ftp自动下载.自动上传脚本,可以递归目录操作 ''' from ftplib import FTP import os,sys,string,datetime,time import socket class MYFTP: def __init__(self, hostaddr, username, password, rem

  • Python实现连接FTP并下载文件夹

    目录 第一章:连接FTP服务器并实现文件夹下载 ①连接FTP服务器 ②进入指定目录并显示文件信息 ③区分文件和文件夹名 ④文件夹名包含空格处理 ⑤使用递归实现:FTP服务器里的文件夹下载到本地 第二章:问题解决 第一章:连接 FTP 服务器并实现文件夹下载 ① 连接 FTP 服务器 如果 FTP 不用用户名密码就直接可以访问,那就是用的默认用户名 Anonymous,密码为空. # -*- coding: UTF8 -*- # 2022-3-8 # 作者:小蓝枣 # python连接ftp服务器

  • python实现从ftp上下载文件的实例方法

    python从ftp上下载文件的方法: 首先导入ftp模块: 然后使用[chdir]命令切换工作路径: 再使用"self.ftp.nlst()"命令获取目录下的文件: 最后使用"self.ftp.retrbinary()"命令下载ftp文件即可. #!/usr/bin/python # coding=utf-8 import os from ftplib import FTP # 引入ftp模块 class MyFtp: ftp = FTP() def __init

  • python实现从ftp服务器下载文件的方法

    本文实例讲述了python实现从ftp服务器下载文件的方法.分享给大家供大家参考.具体实现方法如下: import ftplib ftp = ftblib.FTP("ftp.yourServer.com") ftp.login("username","password") filename = "index.html" ftp.storlines("STOR "+filename,open(filename

  • python递归下载文件夹下所有文件

    最近想备份网站,但是php下载文件的大小是有大小限制的,而我也懒得装ftp再下载了,就想着暂时弄个二级域名站,然后用python(python3)的requests库直接下载网站根目录下的所有文件以及文件夹.(0-0就是这么任性) 1.安装requests库 pip install requests 2.下载文件夹下所有文件及文件夹 这里需要处理的地方主要是文件夹,这里我们判断出该链接是文件夹时,自动创建文件夹,并递归继续进行操作,否则判断该链接是文件,直接使用requests get方法下载,

  • PHP连接sftp并下载文件的方法教程

    前言 sFTP(安全文件传输程序)是一种安全的交互式文件传输程序,其工作方式与 FTP(文件传输协议)类似. 然而,sFTP 比 FTP 更安全:它通过加密 SSH 传输处理所有操作. 下面这篇文章主要介绍了关于PHP连接sftp并下载文件的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 方法如下: 首先我们要知道如何在命令行下连接,了解了之后就清楚大概的原理了 命令行连接的方式如下 sftp -P port user@host 如果端口号默认是22的话就不需要端口号的

  • Python实现删除时保留特定文件夹和文件的示例

    实现功能:删除当前目录下,除保留目录和文件外的所有文件和目录 #!bin/env python import os import os.path import shutil def DeleteFiles(path, remainDirsList, filesList): dirsList = [] dirsList = os.listdir(path) for f in dirsList: if f not in remainDirsList: filePath = os.path.join(

  • python批量创建指定名称的文件夹

    本文实例为大家分享了python批量创建指定名称的文件夹具体代码,供大家参考,具体内容如下 继删除多余文件之后,做了一些数据处理,需要重新保存数据,但文件夹的名称又不能改 所以只能创建新的文件夹,换个路径用之前的文件夹名 import os import glob #txt文件生成一次就好,或者用os.walk遍历需要的文件夹名称路径 def mk_text(txt_path): folders = glob.glob(txt_path + '/*_1') writeText = open('F

  • 解决python中os.listdir()函数读取文件夹下文件的乱序和排序问题

    1. os.listdir()概述 os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表. 例如: dir ='F:/Home_01/img'#当前目录 filenames=os.listdir(dir)#filenames存储dir下的所有文件名. 注意:os.listdir()返回的文件名不一定是顺序的,也就是说结果是不固定的,如下图,则filenames[0]有可能为'22.jpg',而不是我们所希望的'11.jpg'. 解决办法: filenames=os.l

随机推荐