python 使用ftplib连接ftp服务器获取目录、文件及它们的修改时间

简介: * 获取当前路径或者指定路径下的文件、目录* 检查指定路径是目录还是文件* 根据目录、文件的修改时间来判断是否下载ftp的文件。由于ftplib中的FTP无法满足我这一需求,所以只能重写一个MyFTP类继承FTP,写一个方法来实现,除了这个还实现了一个获取当前目录下的所有目录及文件。

你的点赞与评论是我最大的创作动力!

在这里插入图片描述

需求:

  • 获取当前路径或者指定路径下的文件、目录
  • 检查指定路径是目录还是文件
  • 根据目录、文件的修改时间来判断是否下载ftp的文件。

由于ftplib中的FTP无法满足我这一需求,所以只能重写一个MyFTP类继承FTP,写一个方法来实现,除了这个还实现了一个获取当前目录下的所有目录及文件。

from ftplib import FTP, error_perm
import os
import re


class MyFTP(FTP):
    encoding = "utf-8"

    def getdirs(self, dirpath=None):
        """
        获取当前路径或者指定路径下的文件、目录
        :param args:
        :return:
        """
        if dirpath != None:
            self.cwd(dirpath)
        dir_list = []
        self.dir('.', dir_list.append)
        dir_name_list = [dir_detail_str.split(' ')[-1] for dir_detail_str in dir_list]
        return [file for file in dir_name_list if file != "." and file !=".."]

    def checkFileDir(self, dirpath):
        """
        检查指定路径是目录还是文件
        :param dirpath: 文件路径或目录路径
        :return:返回字符串“File”为文件,“Dir”问文件夹,“Unknow”为无法识别
        """
        rec = ""
        try:
            rec = self.cwd(dirpath)  # 需要判断的元素
            self.cwd("..")  # 如果能通过路劲打开必为文件夹,在此返回上一级
        except error_perm as fe:
            rec = fe  # 不能通过路劲打开必为文件,抓取其错误信息
        finally:
            if "Not a directory" in str(rec):
                return "File"
            elif "Current directory is" in str(rec):
                return "Dir"
            else:
                return "Unknow"

    def get_modify_time(self, dirpath=None):
        """
        得到指定目录、文件或者当前目录、文件的修改时间
        :param dirname:
        :return:
        """
        if dirpath != None:
            if dirpath[-1] == '/':
                dir_path = os.path.split(dirpath[0: -1])[0]
                current_name = os.path.split(dirpath[0: -1])[1]
            else:
                dir_path = os.path.split(dirpath)[0]
                # .strip()是为了避免出现”/ 2095-8757“这种情况,下面匹配不到
                current_name = os.path.split(dirpath)[1].strip()
            self.cwd(dir_path)
        else:
            dirpath = self.pwd()
            dir_path = os.path.split(dirpath)[0]
            current_name = os.path.split(dirpath)[1]
            self.cwd(dir_path)

        detail_list = []
        self.retrlines('MLSD', detail_list.append)

        current_info = ''
        for detail_info in detail_list:
            # 文件和目录不一样
            # 文件从字符串获取名称
            if detail_info.split(';')[3].strip() == current_name:
                current_info = detail_info
                break
        if not current_info:
            for detail_info in detail_list:
                # 目录从字符串获取名称
                if detail_info.split(';')[2].strip() == current_name:
                    current_info = detail_info
        modify_time = re.search(r'modify=(.*);', current_info).group(1)

        return modify_time

getdirs()功能是获取当前路径或者指定路径下的文件、目录

  • 代码大致思路是使用dir_list列表放dir()列出的信息, 然后再将名字的信息过滤出来返回其列表。
  • 注意:将...目录去掉

checkFileDir()功能是检查指定路径是目录还是文件

  • 代码大致思路是使用cwd()并检查异常信息判断是文件还是目录。
  • 注意:尽量将路径返回原来的路径。

get_modify_time()功能是得到指定目录、文件或者当前目录、文件的修改时间

  • 代码大致思路是将当前路径或者传入的路径切分成上一级目录的路径和当前的目录或文件的名称,使用retrlines('MLSD', detail_list.append)将上一级目录的路径下所有的目录或文件所有MLSD信息存储到detail_list中,再对比出当前文件或者目录的MLSD信息,然后将修改日期切分出来,由于文件有size、目录没有size,所以需要在切分时区分。
  • 注意:得到的修改时间在windows下并非是时间戳,上述实现也是在windows下实现的,linux可能会不不同,请自行参考思路。

由于上述get_modify_time()取得并不是时间戳,所以要想得到修改日期的时间戳(只包含年月日),可做如下处理, 下面是连接以及得到时间戳的代码:

from myftp import MyFTP
import os

def connect_ftp(host, port, user, passwd):
    """

    :param host:
    :param port:
    :param user:
    :param passwd:
    :return:
    """
    ftpServer = MyFTP()
    ftpServer.encoding = "utf-8"
    ftpServer.connect(host=host, port=port)
    ftpServer.login(user=user, passwd=passwd)
    return ftpServer

# 连接服务器(参数是你的ftp服务器东西)
ftpServer = connect_ftp(host, port, username, password)

file_modify_t = ftpServer.get_modify_time(dirpath=file_path)
file_date_str = file_modify_t[0:4] + '-' + file_modify_t[4:6] + '-' + file_modify_t[6:8] + ' ' + '00:00:00'

file_date_str为得到的时间戳。
整个代码已经在github仓库中:https://github.com/Chenhonli/python-frequently-feature/tree/master/src/pubfuc/ftp_operate
推荐一下python程序员常用功能的一个仓库(定期有新模块更新,求星):https://github.com/Chenhonli/python-frequently-feature

目录
相关文章
|
4月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
120 9
|
6月前
|
存储 UED Windows
Windows服务器上大量文件迁移方案
Windows服务器上大量文件迁移方案
376 1
|
2月前
|
存储 安全 网络安全
服务器感染了.baxia勒索病毒,如何确保数据文件完整恢复?
近年来,勒索病毒如.baxia不断演变,利用漏洞、社交工程等手段加密文件,威胁范围扩大。加密货币的兴起使其支付方式更匿名,追踪困难。技术支持尤为重要,添加技术服务号(shuju315),专业团队提供数据恢复方案。面对复杂解密要求,包括赎金支付、个人信息提供和执行特定操作,需保持冷静并寻求帮助。防御措施包括加强安全意识、定期备份数据、安装杀毒软件、避免未知文件、更新系统及制定应急响应计划。
93 11
|
4月前
|
中间件 Docker Python
【Azure Function】FTP上传了Python Function文件后,无法在门户页面加载函数的问题
通过FTP上传Python Function至Azure云后,出现函数列表无法加载的问题。经排查,发现是由于`requirements.txt`中的依赖包未被正确安装。解决方法为:在本地安装依赖包到`.python_packages/lib/site-packages`目录,再将该目录内容上传至云上的`wwwroot`目录,并重启应用。最终成功加载函数列表。
|
5月前
|
Python
Flask学习笔记(三):基于Flask框架上传特征值(相关数据)到服务器端并保存为txt文件
这篇博客文章是关于如何使用Flask框架上传特征值数据到服务器端,并将其保存为txt文件的教程。
61 0
Flask学习笔记(三):基于Flask框架上传特征值(相关数据)到服务器端并保存为txt文件
|
6月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
85 4
|
5月前
|
前端开发 Docker 容器
主机host服务器和Docker容器之间的文件互传方法汇总
Docker 成为前端工具,可实现跨设备兼容。本文介绍主机与 Docker 容器/镜像间文件传输的三种方法:1. 构建镜像时使用 `COPY` 或 `ADD` 指令;2. 启动容器时使用 `-v` 挂载卷;3. 运行时使用 `docker cp` 命令。每种方法适用于不同场景,如静态文件打包、开发时文件同步及临时文件传输。注意权限问题、容器停止后的文件传输及性能影响。
1277 0
|
5月前
|
安全 网络协议 网络安全
Windows Server 2003 FTP服务器搭建
Windows Server 2003 FTP服务器搭建
|
5月前
|
弹性计算 关系型数据库 网络安全
阿里云国际版无法连接和访问Windows服务器中的FTP服务
阿里云国际版无法连接和访问Windows服务器中的FTP服务
|
5月前
|
网络安全 Windows
Jetson 学习笔记(十五):FTP协议传输文件
本文介绍了如何使用WinSCP软件通过FTP协议在Windows和Jetson设备之间传输文件,并分享了一些操作经验和技巧。
75 0
Jetson 学习笔记(十五):FTP协议传输文件