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

举报
橙子园 发表于 2022/05/25 23:55:23 2022/05/25
【摘要】 你的点赞与评论是我最大的创作动力! 需求: 获取当前路径或者指定路径下的文件、目录检查指定路径是目录还是文件根据目录、文件的修改时间来判断是否下载ftp的文件。 由于ftplib中的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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80

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'

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

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

文章来源: blog.csdn.net,作者:橙子园,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/Chenftli/article/details/105119451

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。