gpt4 book ai didi

python - ftp.retrbinary() 帮助 python

转载 作者:太空狗 更新时间:2023-10-29 19:32:32 29 4
gpt4 key购买 nike

我已经创建了一个 python 脚本来连接到 remserver。

datfile = []
for dk in range(len(files)):
dfnt=files[dk]
dpst=dfnt.find('.dat')
if dpst == 15:
dlist = dfnt[:]
datfile.append(dlist)

assert datfile == ['a.dat','b.dat']
# True

如您所见,它创建了一个列表。现在我将这个列表传递给

ftp.retrbinary('datfile')

但是这行返回一个错误:

typeerror: retrbinary() takes at least 3 arguments (2 given)

不确定要找什么?

最佳答案

它告诉您您没有为 retrbinary 方法提供足够的参数。

documentation specifies您还必须提供一个“回调”函数,该函数会为接收到的每个数据 block 调用。您需要编写一个回调函数并对它提供给您的数据执行某些操作(例如,将其写入文件、将其收集到内存中等)

作为旁注,您可能会问为什么它说有“3”个必需参数而不是“2”。这是因为它还计算了 Python 在实例方法上需要的“self”参数,但您是通过 ftp 对象引用隐式传递它。

编辑 - 看来我可能没有完全回答你的问题。

对于 command 参数,您应该传递有效的 RETR 命令,而不是列表。

filenames = ['a.dat', 'b.dat']

# Iterate through all the filenames and retrieve them one at a time
for filename in filenames:
ftp.retrbinary('RETR %s' % filename, callback)

对于回调,您需要传递接受单个参数的可调用对象(通常是某种函数)。参数是正在检索的文件中的一大块数据。我说“ block ”是因为当你移动大文件时,你很少想将整个文件保存在内存中。该库旨在在接收数据 block 时迭代地调用您的回调。这允许您写出文件的 block ,因此您只需在任何给定时间在内存中保留相对少量的数据。

我的示例有点高级,但您的回调可以是 for 循环内的闭包,它写入已打开的文件:

import os

filenames = ['a.dat', 'b.dat']

# Iterate through all the filenames and retrieve them one at a time
for filename in filenames:
local_filename = os.path.join('/tmp', filename)

# Open a local file for writing (binary mode)...
# The 'with' statement ensures that the file will be closed
with open(local_filename, 'wb') as f:
# Define the callback as a closure so it can access the opened
# file in local scope
def callback(data):
f.write(data)

ftp.retrbinary('RETR %s' % filename, callback)

这也可以用 lambda 语句更简洁地完成,但我发现 Python 的新手及其一些函数式概念更容易理解第一个示例。不过,这里是使用 lambda 的 ftp 调用:

ftp.retrbinary('RETR %s' % filename, lambda data: f.write(data))

我想你甚至可以这样做,将文件的 write 实例方法直接作为你的回调传递:

ftp.retrbinary('RETR %s' % filename, f.write)

所有这三个示例应该都是类似的,希望通过跟踪它们可以帮助您了解正在发生的事情。

为了示例,我省略了任何类型的错误处理。

另外,我没有测试上面的任何代码,所以如果它不起作用请告诉我,我会看看是否可以澄清它。

关于python - ftp.retrbinary() 帮助 python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4696413/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com