python ftp批量下载文件_Python | Python实现ftp文件批量下载(包含目录)

这个Python脚本实现了FTP文件的批量下载,包括整个目录及其内容。它具有下载进度显示、断点续传功能,能递归地下载远程目录。通过重载FTP的retrbinary方法来实现进度条,并提供了下载整个目录树的函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本代码实现了以下功能:

下载进度显示(同一行打印)

断点续传

递归下载整个目录文件

import unittest # 单元测试用例

import os

import re

import sys

from ftplib import FTP # 定义了FTP类,实现ftp上传和下载

# 继承FTP类,对父类中retrbinary方法进行重载,实现进度条显示

class MyFTP(FTP):

"""

cmd:命令

callback:回调函数

fsize:服务器中文件总大小

rest:已传送文件大小

"""

def retrbinary(self, cmd, callback, fsize=0, rest=0):

cmpsize = rest

self.voidcmd('TYPE I')

#此命令实现从指定位置开始下载,以达到续传的目的

conn = self.transfercmd(cmd, rest)

while 1:

if fsize:

if (fsize-cmpsize) >= 1024:

blocksize = 1024

else:

blocksize = fsize - cmpsize

ret = float(cmpsize)/fsize

num = ret*100

# 实现同一行打印下载进度

print ('下载进度: %.2f%%'%num, end='\r')

data = conn.recv(blocksize)

if not data:

break

callback(data)

cmpsize += blocksize

conn.close()

return self.voidresp()

host = 'ftp.ncbi.nlm.nih.gov'

port = 21

username = ''

password = ''

ftp = MyFTP()

ftp.connect(host,port)

ftp.login(username, password)

"""

RemoteFile: 要下载的文件名(服务器中)

LocalFile: 本地文件路径

bufsize: 服务器中文件大小

"""

def ftp_download(LocalFile, RemoteFile, bufsize):

# 本地是否有此文件,来确认是否启用断点续传

if not os.path.exists(LocalFile):

with open(LocalFile, 'wb') as f:

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

f.close()

# ftp.set_debuglevel(0) #关闭调试模式

return True

else:

p = re.compile(r'\\',re.S)

LocalFile = p.sub('/', LocalFile)

localsize = os.path.getsize(LocalFile)

with open(LocalFile, 'ab+') as f:

ftp.retrbinary('RETR %s' % RemoteFile, f.write, bufsize, localsize)

f.close()

# ftp.set_debuglevel(0) #关闭调试模式

return True

# 下载整个目录下的文件

def DownLoadFileTree(LocalDir, RemoteDir):

print("RemoteDir:", RemoteDir)

if not os.path.exists(LocalDir):

os.makedirs(LocalDir)

# 打开该远程目录

ftp.cwd(RemoteDir)

# 获取该目录下所有文件名,列表形式

RemoteNames = ftp.nlst()

for file in RemoteNames:

Local = os.path.join(LocalDir, file) # 下载到当地的全路径

print(ftp.nlst(file)) # [如test.txt]

if file.find(".") == -1: #是否子目录 如test.txt就非子目录

if file.find("README") == -1:

if not os.path.exists(Local):

os.makedirs(Local)

DownLoadFileTree(Local, file) # 下载子目录路径

else:

ftp.voidcmd('TYPE I') # 将传输模式改为二进制模式 ,避免提示 ftplib.error_perm: 550 SIZE not allowed in ASCII

bufsize = ftp.size(file) #服务器里的文件总大小

print(bufsize)

ftp_download(Local, file, bufsize)

else:

ftp.voidcmd('TYPE I') # 将传输模式改为二进制模式 ,避免提示 ftplib.error_perm: 550 SIZE not allowed in ASCII

bufsize = ftp.size(file) #服务器里的文件总大小

print(bufsize)

ftp_download(Local, file, bufsize)

ftp.cwd("..") # 返回路径最外侧

return

class TestDownloader(unittest.TestCase):

def setUp(self):

print('------Start------')

def test_download(self):

file_remote = '/snp/'

file_local = 'D:/Pythonworkspace/org/snp/'

DownLoadFileTree(file_local, file_remote)

def tearDown(self):

print('------Finish------')

if __name__ == '__main__':

unittest.main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值