是否可以在从列表函数检索文件列表信息的同时使用 Python ftplib 下载文件?

问题描述

我有一个如下所示的场景。我的目标是打印出我从 Python ftplib retrlines("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)
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') 获取文件名。如果我先检索文件名,然后再处理文件,我就没有问题。如果我尝试一次完成所有操作,则会收到如下所示的错误

enter image description here

解决方法

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

要么:

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

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