将 retrbinary 输出存储到文件对象 - Python

Store retrbinary output to fileobject - Python

有没有办法可以将 ftplib 中的 retrbinary 函数的输出存储到 python 中的文件对象中?这个想法是从 ftp 服务器检索文件并使用 lambda 函数将它们上传到 s3 存储桶。想知道这是否可以在不使用 paramiko 库的情况下单独使用 ftplib 来完成。

import ftplib
server = ftplib.FTP()
server.connect(xxxx)
server.login()
with open('test.xlsx',wb) as fp:
     server.retrbinary('RETR test.xlsx',fp.write)
server.quit()

以上代码将 test.xlsx 文件下载到本地,但我需要将其存储到文件对象中。

您可以使用内存字节缓冲区!。您可以将 buffer.write 函数作为回调传递给 retrbinary 方法。

>>> from io import BytesIO
>>> buffer = BytesIO()
>>> buffer.write(b"Hello")
5
>>> buffer.getvalue()
b'Hello'

因此您可以将现有代码更改为类似这样的内容,

>>> import ftplib
>>> from io import BytesIO
>>>
>>> buffer = BytesIO()
>>> server = ftplib.FTP()
>>> server.connect(xxxx)
>>> server.login()
>>> server.retrbinary('RETR test.xlsx', buffer.write)
>>> server.quit()

因此在 retrbinary 调用完成后,缓冲区将填充字节值,您可以通过调用 buffer.getvalue() 方法来确认。