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

目录
相关文章
|
5月前
|
人工智能 JavaScript API
零基础构建MCP服务器:TypeScript/Python双语言实战指南
作为一名深耕技术领域多年的博主摘星,我深刻感受到了MCP(Model Context Protocol)协议在AI生态系统中的革命性意义。MCP作为Anthropic推出的开放标准,正在重新定义AI应用与外部系统的交互方式,它不仅解决了传统API集成的复杂性问题,更为开发者提供了一个统一、安全、高效的连接框架。在过去几个月的实践中,我发现许多开发者对MCP的概念理解透彻,但在实际动手构建MCP服务器时却遇到了各种技术壁垒。从环境配置的细节问题到SDK API的深度理解,从第一个Hello World程序的调试到生产环境的部署优化,每一个环节都可能成为初学者的绊脚石。因此,我决定撰写这篇全面的实
1012 67
零基础构建MCP服务器:TypeScript/Python双语言实战指南
|
4月前
|
人工智能 自然语言处理 安全
Python构建MCP服务器:从工具封装到AI集成的全流程实践
MCP协议为AI提供标准化工具调用接口,助力模型高效操作现实世界。
835 1
|
5月前
|
安全 Linux 网络安全
Python极速搭建局域网文件共享服务器:一行命令实现HTTPS安全传输
本文介绍如何利用Python的http.server模块,通过一行命令快速搭建支持HTTPS的安全文件下载服务器,无需第三方工具,3分钟部署,保障局域网文件共享的隐私与安全。
1057 0
|
SQL 关系型数据库 MySQL
使用python连接MySQL数据库,进行增删改查,实现步骤
在Python中连接MySQL数据库并进行增删改查操作,我们需要使用一个库叫做pymysql。
463 4
|
SQL 关系型数据库 MySQL
Python中连接MySQL数据库并进行增删改查操作
Python中连接MySQL数据库并进行增删改查操作
224 1
|
关系型数据库 MySQL 数据库
python3连接MySQL数据库,并执行数据库的基本增删改查操作
python3连接MySQL数据库,并执行数据库的基本增删改查操作
779 0
|
关系型数据库 MySQL 数据库
教你如何用Python连接MySQL,增删改查
教你如何用Python连接MySQL,增删改查
347 0
教你如何用Python连接MySQL,增删改查
|
SQL 数据库 Python
python3连接mysql--增删改查
ps:MYSQLdb只适用于python2.x python3不支持MYSQLdb,取而代之的是pymysql 运行会报:ImportError:No module named 'MYSQLdb'
221 0
|
3月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
304 102
|
3月前
|
数据采集 机器学习/深度学习 算法框架/工具
Python:现代编程的瑞士军刀
Python:现代编程的瑞士军刀
325 104