微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决是否可以在从列表函数检索文件列表信息的同时使用 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 ...'))仍在执行。

要么:

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。