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

时间:2018-08-08 22:47:26

标签: python ftp ftplib

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

plot(data$NodeID, data$pageRank, type="o", col="red", xlab="NodeID", ylab="PageRank Value")

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

非常感谢你们。

1 个答案:

答案 0 :(得分:1)

如果您的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 get the most recent file by date


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

  • 如果要基于修改时间戳记来决定,并且服务器支持非标准的-t开关,则可以使用:

    lines = ftp.nlst("-t")
    latest_name = lines[-1]
    

    请参见How to get files in FTP folder sorted by modification time

  • 如果要使用文件名:

    lines = ftp.nlst()
    latest_name = max(lines)