问题描述
我有一个如下所示的场景。我的目标是打印出我从 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')
获取文件名。如果我先检索文件名,然后再处理文件,我就没有问题。如果我尝试一次完成所有操作,则会收到如下所示的错误:
解决方法
当您仍在使用同一连接下载目录列表时,您无法下载文件。无论您使用什么 FTP 库,这对于 FTP 协议都是不可能的。就 ftplib API 而言:您不能回调 FTP
类(您不能调用 FTP.retrlines('RETR ...')
),而另一个方法(FTP.retrlines('LIST ...')
)仍在执行。
要么:
-
打开两个连接,一个用于列表,一个用于文件下载。
-
或者坚持使用“先检索文件名,然后再处理文件” – 我看不出有什么问题。