在Python中获取最新的FTP文件夹名称

发布于 2021-01-29 14:59:34

我正在尝试编写脚本以从Python中FTP服务器的最新子目录获取最新文件。我的问题是我无法找出最新的子目录。有两个选项可用,子目录具有ctime可用。在目录名称中还提到了日期,即在哪个日期创建了目录。但是我不知道如何获取最新目录的名称。我想出了以下方法(希望服务器端按最新的ctime排序)。我已经按照以下方式进行了操作,如果第一个对象是最新目录,它将可以正常工作。

import ftplib 
import os
import time

ftp = ftplib.FTP('test.rebex.net','demo', 'password')
ftp.cwd(str((ftp.nlst())[0])) #if directory is sorted in descending order by date.

但是,有什么方法可以通过ctime或目录名称中的日期找到确切的目录?

非常感谢。

关注者
0
被浏览
94
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    如果您的FTP服务器支持MLSD命令,则解决方案很简单:

    • 如果您要根据修改时间戳记做出决定:

      entries = list(ftp.mlsd())
      

      Only interested in directories

      entries = [entry for entry in entries if entry[1][“type”] == “dir”]

      Sort by timestamp

      entries.sort(key = lambda entry: entry[1][‘modify’], reverse = True)

      Pick the first one

      latest_name = entries[0][0]
      print(latest_name)

    • 如果要使用文件名:

      # Sort by filename
      

      entries.sort(key = lambda entry: entry[0], reverse = True)


    如果您需要使用过时的LIST命令,则必须解析它返回的专有列表。

    常见的* nix列表如下:

    drw-r--r-- 1 user group           4096 Mar 26  2018 folder1-20180326
    drw-r--r-- 1 user group           4096 Jun 18 11:21 folder2-20180618
    -rw-r--r-- 1 user group           4467 Mar 27  2018 file-20180327.zip
    -rw-r--r-- 1 user group         124529 Jun 18 15:31 file-20180618.zip
    

    使用这样的清单,此代码将执行以下操作:

    • 如果您要根据修改时间戳记做出决定:

      lines = []
      

      ftp.dir(“”, lines.append)

      latest_time = None
      latest_name = None

      for line in lines:
      tokens = line.split(maxsplit = 9)
      # Only interested in directories
      if tokens[0][0] == “d”:
      time_str = tokens[5] + ” ” + tokens[6] + ” ” + tokens[7]
      time = parser.parse(time_str)
      if (latest_time is None) or (time > latest_time):
      latest_name = tokens[8]
      latest_time = time

      print(latest_name)

    • 如果要使用文件名:

      lines = []
      

      ftp.dir(“”, lines.append)

      latest_name = None

      for line in lines:
      tokens = line.split(maxsplit = 9)
      # Only interested in directories
      if tokens[0][0] == “d”:
      name = tokens[8]
      if (latest_name is None) or (name > latest_name):
      latest_name = name

      print(latest_name)

    某些FTP服务器可能返回...输入LIST结果。您可能需要过滤它们。


    部分基于:Python
    FTP按日期获取最新文件


    如果该文件夹不包含任何文件,仅包含子文件夹,则还有其他更简单的选项。

    • 如果要基于修改时间戳记来决定,并且服务器支持非标准-t切换,则可以使用:
      lines = ftp.nlst("-t")
      

      latest_name = lines[-1]

    请参见如何获取按修改时间排序的FTP文件夹中的文件

    • 如果要使用文件名:
      lines = ftp.nlst()
      

      latest_name = max(lines)



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看