python - 是否可以在从 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')
. 如果我先检索文件名,然后再处理文件,我没有问题。如果我尝试一次完成所有操作,我会收到如下所示的错误:
解决方案
当您仍在使用同一连接下载目录列表时,您无法下载文件。这对于 FTP 协议是不可能的,无论您使用什么 FTP 库。就 ftplib API 而言:不能回调FTP
类(不能调用FTP.retrlines('RETR ...')
),而另一个方法(FTP.retrlines('LIST ...')
)仍在执行。
任何一个:
打开两个连接,一个用于列表,一个用于文件下载。
或者坚持“先检索文件名,然后再处理文件” ——我看不出有什么问题。
推荐阅读
- java - ModelMapper 不可变 DTO 自定义映射
- git - git怎么知道有冲突
- php - 如果不推荐使用“security.authentication.manager”服务,如何替换它?
- c# - 在 Gitlab CI 中将 Blazor 的 E2E 测试与 Selenium 集成时修复“无法在 http://localhost 上启动驱动程序服务:...已在使用中”
- javascript - 如何打开浏览器扩展中包含的 html 文件?
- reverse-engineering - 从专有存档格式中提取文件
- c++ - 如何将整行推回向量?
- android - Ionic 5 应用程序未从 android 上的 REST API 获取数据
- android - 如何从样式更改操作栏/工具栏图标的色调
- python - 在 PostgreSQL 和 Django 中将 UUID 字段设置为主键时出错