- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我已经创建了一个 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/
使用 Python 2.6 并以被动模式从 FTP 服务器下载文件,我发现如果源文件为空(0 字节),retrbinary 会失败并超时。这是一个错误还是我缺少配置选项? ftp.retrbinary
我在“ftp.retrbinary("RETR"+ filename, localfile.write)”行中遇到错误。它没有说明到底出了什么问题,我只是得到ftplib.error_perm:500
我目前正在使用此代码打印出使用 ftp.retrbinary 从 ftp 服务器下载的百分比,但下载完成时完成了 0.27%,并且只说 sizeWritten 完成了 27828224 位。我哪里错了
我正在使用 pythons ftplib 尝试从远程服务器检索文件(练习项目)。我在发送文件时没有遇到任何问题,但在尝试检索时遇到错误。我正在使用 python 3。这是我的代码: from ftpl
我正在开发 paramiko sftp。 paramiko中有没有类似ftplib retrbinary函数的函数? 我的项目已经支持ftp,并且使用cStringIO将数据存储在内存中,然后使用re
我正在编写一个使用 FTPLib 获取文件的模块。我想找到一种方法将值(除了 block 之外)传递给回调。本质上,我的回调是 def handleDownload(block, fileToWri
我已经创建了一个 python 脚本来连接到 remserver。 datfile = [] for dk in range(len(files)): dfnt=files[dk] dpst=
我是一名优秀的程序员,十分优秀!