首页 > 解决方案 > 是否可以在从 list 函数中检索文件列表信息的同时使用 Python ftplib 下载文件?

问题描述

我有一个看起来像下面的场景。我的目标是打印出我从 Python ftplibretrlines("LIST")函数中检索的文件的行。任何帮助表示赞赏。

class FTP:

    def __init__(self, hostName, userName, passWord, encoding=None):
        self.ftp = ftplib.FTP(host=hostName, user=userName, passwd=passWord)
        self.defaultEncoding = self.ftp.encoding
        self.ftp.encoding = encoding or self.ftp.encoding
    
    def writeTest(self, fileName, func):
        self.ftp.retrlines(f'RETR {fileName}', func)

    def getFileInformation(self, func=None):

        encoding = self.ftp.encoding
        self.ftp.encoding = self.defaultEncoding
        self.ftp.retrlines('LIST', lambda row: func(self._returnFileInformation(row)))
        self.ftp.encoding = encoding


class FileProcessor:

    def __init__(self, processingFunction: Callable, output: Callable):
        self.processingFunction = processingFunction
        self.output = output
        self.fileCounter = 0

    def processFile(self, file: FileInformation):
        if self.processingFunction(file):
            self.output(file)
            self.fileCounter += 1

def __len__(self):
    return self.fileCounter

lastReadTime = datetime(2020, 10, 29, 0, 0, 0)
ftp = FTP(hostName=hostName, userName=userName, passWord=passWord, encoding='utf-16')
processor = FileProcessor(lambda file: file.timeStamp > lastReadTime, lambda file: ftp.writeTest(file.name, lambda line: print(line)))
ftp.getFileInformation(processor.processFile)

只是在具有名称、大小等的格式良好的类中getFileInformation从函数返回值retrlines LIST。我只是想打印文件的行,因为我从retrlines('LIST'). 如果我先检索文件名,然后再处理文件,我没有问题。如果我尝试一次完成所有操作,我会收到如下所示的错误:

在此处输入图像描述

标签: pythonftpftplib

解决方案


当您仍在使用同一连接下载目录列表时,您无法下载文件。这对于 FTP 协议是不可能的,无论您使用什么 FTP 库。就 ftplib API 而言:不能回调FTP类(不能调用FTP.retrlines('RETR ...')),而另一个方法(FTP.retrlines('LIST ...'))仍在执行。

任何一个:

  • 打开两个连接,一个用于列表,一个用于文件下载。

  • 或者坚持“先检索文件名,然后再处理文件” ——我看不出有什么问题。


推荐阅读