用Python从FTP文件夹(文件名包含空格)中获取最新文件

7

我有一个需求,需要从FTP文件夹中获取最新的文件,问题在于文件名中包含空格并且文件名具有特定的模式。 以下是我实现的代码:

import sys
from ftplib import FTP
import os
import socket
import time
import pandas as pd
import numpy as np
from glob import glob
import datetime as dt
from __future__ import with_statement

ftp = FTP('')
ftp.login('','')
ftp.cwd('')
ftp.retrlines('LIST')

filematch='*Elig.xlsx'
downloaded = []

for filename in ftp.nlst(filematch):
  fhandle=open(filename, 'wb')
  print 'Getting ' + filename
  ftp.retrbinary('RETR '+ filename, fhandle.write)
  fhandle.close()
  downloaded.append(filename)

ftp.quit()

我了解到我可以在ftp.dir()命令后附加一个空列表,但由于文件名中有空格,我无法正确地拆分它并选择我上面提到类型的最新文件。任何帮助都将是极好的。

1
发布的程序有什么行为?它对你来说是否正常工作?它是否打印错误消息?还是完全做了其他事情? - Robᵩ
它可以很好地拉取我想要的文件,我已经为一次性过程这样做了。但是接下来,我需要自动化它,并且根据日期开始仅选择最新的文件。 - Manas Jani
为了以后参考,给我们一个示例文件名会很好。这样我们就知道它实际上是什么样子的。 - Torxed
这里是ABC文件1/3_XXX_MV2_PElig.xlsx,但我想文件名并不是那么重要!因为上面的代码已经有了我提到的文件模式。 - Manas Jani
如果您只与一个特定的FTP服务器通信,则应该可以解析LIST输出以获取时间戳,尽管文件名中有空格。除非可用MDTM(R.Neumann的答案),否则我看不到其他方法。 - VPfB
列表输出具有时间戳,但我想迭代并将最新的文件提取出来。我认为ftp.retrlines('LIST' -t *Elig.xlsx)会给我一个正确的方法,但它并没有帮助到我。 - Manas Jani
2个回答

5

如果FTP服务器支持,您可以通过发送MDTM命令获取文件修改时间,并相应地对FTP服务器上的文件进行排序。

def get_newest_files(ftp, limit=None):
    """Retrieves newest files from the FTP connection.

    :ftp: The FTP connection to use.
    :limit: Abort after yielding this amount of files.
    """

    files = []

    # Decorate files with mtime.
    for filename in ftp.nlst():
        response = ftp.sendcmd('MDTM {}'.format(filename))
        _, mtime = response.split()
        files.append((mtime, filename))

    # Sort files by mtime and break after limit is reached.
    for index, decorated_filename in enumerate(sorted(files, reverse=True)):
        if limit is not None and index >= limit:
            break

        _, filename = decorated_filename  # Undecorate
        yield filename


downloaded = []

# Retrieves the newest file from the FTP server.
for filename in get_newest_files(ftp, limit=1):
    print 'Getting ' + filename

    with open(filename, 'wb') as file:
        ftp.retrbinary('RETR '+ filename, file.write)

    downloaded.append(filename)

我尝试运行这段代码,但它仍然从ftp中检索所有对应类型的文件,而不是其中最新的文件。 - Manas Jani
1
非常感谢!这个方法可行...我只需要添加一个参数来反转sorted(files)的顺序,以便选择最新的文件,并将限制更改为1,以便只选择最新的文件。再次感谢您的帮助! - Manas Jani

1
问题在于FTP的“LIST”命令返回供人类阅读的文本,其格式取决于FTP服务器实现方式。
使用PyFilesystem(替代标准ftplib)及其API将提供一个“list”API(搜索“walk”),该API提供FTP服务器中托管的文件和目录列表的Pythonic结构。

http://pyfilesystem2.readthedocs.io/en/latest/index.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接