我需要下载大量数据(每天大约30 GB,其中一些文件大于1GB)。特别是对于大文件,我通过FileZilla下载的速度比我手动下载(右键单击并保存在Windows中)或通过Python 3.3下载快一个数量级(几乎10倍)。
下面给出的我的python 3.3脚本以递归方式遍历FTP站点上的目录,并且只有在尚未下载该文件的情况下才下载文件(它是此论坛上两个不同帖子的修改版本)。我想替换Python 3.3的本机ftplib(在下面的代码中)来使用FileZilla。
import ftplib
import os
def traverseFTP(ftpObj,depth,cdir,bdir):
# print(depth)
if depth>10:
return []
else:
# do the following
data=[]
ftpObj.dir(data.append)
for entry in data:
# dName=entry[55:len(entry)].strip()
dName=entry.split()[-1]
dIsDir=entry[0]
if dName!="." and dName!="..":
if dIsDir!="d":
# download if not already downloaded
dFullName=bdir+cdir+"\\"+dName
if not os.path.isfile(dFullName):
print("... Downloading ",dName)
if not os.path.isdir(bdir+cdir): os.makedirs(bdir+cdir)
ftpObj.retrbinary('RETR %s' % dName,open(dFullName,'wb').write)
else:
ftpObj.cwd(dName)
cdir1=cdir+"\\"+dName
print("\nEntering ",cdir1)
traverseFTP(ftpObj,depth+1,cdir1,bdir)
ftpObj.cwd("..")
print("Exiting ",cdir1)
def ftpInitialize(ftpHost,userID,userPW):
ftpObj=ftplib.FTP(ftpHost)
ftpObj.login(user=userID,passwd=userPW)
return ftpObj
def main():
ftpHost="hostname"
userID="userlogin"
userPW="userpassword"
targetDir="D:\\LocalDir"
ftpObj=ftplib.FTP(ftpHost)
ftpObj.login(user=userID,passwd=userPW)
traverseFTP(ftpObj,0,"",targetDir)
ftpObj.quit()
if __name__=="__main__":
main()
请注意:请认为我是Python初学者(因此将非常感谢详细的答案)。
此外,Python 3.3的ftplib中的文件大小(下载文件的)是否有任何限制?我的代码通常在尺寸>上被绞死0.5 GB,但在尺寸上工作正常< 0.5 GB。我在64位Windows 7 PC上使用WinPython-64bit-3.3.2.1发行版(即64位)。