【问题标题】:Getting the latest files from FTP folder (filename having spaces) in Python在 Python 中从 FTP 文件夹(文件名有空格)获取最新文件
【发布时间】:2017-09-20 15:33:57
【问题描述】:

我有一个要求,我必须从 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() 命令,但由于文件名有空格,我无法以正确的方式拆分它并选择我提到的最新类型的文件以上。

任何帮助都会很棒。

【问题讨论】:

  • 发布的程序的行为是什么?它是否适合您?它会打印错误消息吗?是否完全在做其他事情?
  • 拉取我想要的文件效果很好,我这样做了一次。但接下来,我需要将其自动化并开始根据日期仅选择最新的文件。
  • 为了将来参考,给我们一个示例文件名会很整洁。只是为了让我们知道它的实际外观。
  • ABC 文件 1 of 3_XXX_MV2_PElig.xlsx,给你……但我想文件名应该不是那么重要!由于上面的代码已经有了我提到的文件模式。
  • 如果您只与一个特定的 FTP 服务器通信,尽管文件名中有空格,但应该可以解析 LIST 输出的时间戳。除非 MDTM 可用(R.Neumann 的回答),否则我看不到其他方法。

标签: python python-2.7 ftplib


【解决方案1】:

如果 FTP 服务器支持,您可以通过发送MDTM 命令获取文件 mtime,并相应地对 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 中提取所有文件,而不是最新的。
  • 非常感谢!这行得通...我只需要添加参数来反转排序(文件),以获取最新文件,并将限制更改为 1 以仅获取最新文件。再次感谢您的帮助!
【解决方案2】:

问题在于 FTP“LIST”命令会为人类返回文本,具体格式取决于 FTP 服务器的实现。

使用 PyFilesystem(代替标准 ftplib)及其 API 将提供一个“列表”API(搜索“walk”),该 API 提供 FTP 服务器中托管的文件和目录列表的 Pythonic 结构。

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

【讨论】:

    猜你喜欢
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 2023-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多