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

Is it possible download file with Python ftplib at the same time as retrieving file list information from the list function?

我有一个如下所示的场景。我的目标是打印出我从 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, 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 只是 returns 来自 retrlines LIST 函数的值,格式良好 class,具有名称、大小等。我只是想打印文件的行,因为我从 retrlines('LIST') 获取文件名。如果我先检索文件名,然后处理文件,我没有问题。如果我尝试一次完成所有操作,我会收到如下所示的错误:

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

或者:

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

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