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

目录
相关文章
|
数据可视化 Linux iOS开发
Python脚本转EXE文件实战指南:从原理到操作全解析
本教程详解如何将Python脚本打包为EXE文件,涵盖PyInstaller、auto-py-to-exe和cx_Freeze三种工具,包含实战案例与常见问题解决方案,助你轻松发布独立运行的Python程序。
2774 2
|
监控 机器人 编译器
如何将python代码打包成exe文件---PyInstaller打包之神
PyInstaller可将Python程序打包为独立可执行文件,无需用户安装Python环境。它自动分析代码依赖,整合解释器、库及资源,支持一键生成exe,方便分发。使用pip安装后,通过简单命令即可完成打包,适合各类项目部署。
2204 68
|
缓存 数据可视化 Linux
Python文件/目录比较实战:排除特定类型的实用技巧
本文通过四个实战案例,详解如何使用Python比较目录差异并灵活排除特定文件,涵盖基础比较、大文件处理、跨平台适配与可视化报告生成,助力开发者高效完成目录同步与数据校验任务。
438 0
|
安全 Linux 网络安全
Python极速搭建局域网文件共享服务器:一行命令实现HTTPS安全传输
本文介绍如何利用Python的http.server模块,通过一行命令快速搭建支持HTTPS的安全文件下载服务器,无需第三方工具,3分钟部署,保障局域网文件共享的隐私与安全。
3622 0
|
数据管理 开发工具 索引
在Python中借助Everything工具实现高效文件搜索的方法
使用上述方法,你就能在Python中利用Everything的强大搜索能力实现快速的文件搜索,这对于需要在大量文件中进行快速查找的场景尤其有用。此外,利用Python脚本可以灵活地将这一功能集成到更复杂的应用程序中,增强了自动化处理和数据管理的能力。
1117 0
|
网络安全 Windows
Jetson 学习笔记(十五):FTP协议传输文件
本文介绍了如何使用WinSCP软件通过FTP协议在Windows和Jetson设备之间传输文件,并分享了一些操作经验和技巧。
546 0
Jetson 学习笔记(十五):FTP协议传输文件
|
Unix Linux 测试技术
FTP命令不同系统之间传输文件
FTP命令不同系统之间传输文件
|
Linux
Linux:开启FTP传输文件
Linux:开启FTP传输文件
470 0
Linux:开启FTP传输文件

推荐镜像

更多