`

python实现的ftp自动上传下载程序(支持目录递归操作)

阅读更多
因为python脚本可以直接用文本工具打开修改,所以没有设置参数。使用的时候直接修改掉main中的连接下载参数即可。
修改一下,可以用来备份网站上的图片,数据库什么的。

#!/usr/bin/python
#coding=gbk
'''
	ftp自动下载、自动上传脚本,可以递归目录操作
'''

from ftplib import FTP
import os,sys,string,datetime,time
import socket

class MYFTP:
	def __init__(self, hostaddr, username, password, remotedir, port=21):
		self.hostaddr = hostaddr
		self.username = username
		self.password = password
		self.remotedir  = remotedir
		self.port     = port
		self.ftp      = FTP()
		self.file_list = []
		# self.ftp.set_debuglevel(2)
	def __del__(self):
		self.ftp.close()
		# self.ftp.set_debuglevel(0)
	def login(self):
		ftp = self.ftp
		try: 
			timeout = 60
			socket.setdefaulttimeout(timeout)
			ftp.set_pasv(True)
			print '开始连接到 %s' %(self.hostaddr)
			ftp.connect(self.hostaddr, self.port)
			print '成功连接到 %s' %(self.hostaddr)
			print '开始登录到 %s' %(self.hostaddr)
			ftp.login(self.username, self.password)
			print '成功登录到 %s' %(self.hostaddr)
			debug_print(ftp.getwelcome())
		except Exception:
			deal_error("连接或登录失败")
		try:
			ftp.cwd(self.remotedir)
		except(Exception):
			deal_error('切换目录失败')

	def is_same_size(self, localfile, remotefile):
		try:
			remotefile_size = self.ftp.size(remotefile)
		except:
			remotefile_size = -1
		try:
			localfile_size = os.path.getsize(localfile)
		except:
			localfile_size = -1
		debug_print('lo:%d  re:%d' %(localfile_size, remotefile_size),)
		if remotefile_size == localfile_size:
		 	return 1
		else:
			return 0
	def download_file(self, localfile, remotefile):
		if self.is_same_size(localfile, remotefile):
		 	debug_print('%s 文件大小相同,无需下载' %localfile)
		 	return
		else:
			debug_print('>>>>>>>>>>>>下载文件 %s ... ...' %localfile)
		#return
		file_handler = open(localfile, 'wb')
		self.ftp.retrbinary('RETR %s'%(remotefile), file_handler.write)
		file_handler.close()

	def download_files(self, localdir='./', remotedir='./'):
		try:
			self.ftp.cwd(remotedir)
		except:
			debug_print('目录%s不存在,继续...' %remotedir)
			return
		if not os.path.isdir(localdir):
			os.makedirs(localdir)
		debug_print('切换至目录 %s' %self.ftp.pwd())
		self.file_list = []
		self.ftp.dir(self.get_file_list)
		remotenames = self.file_list
		#print(remotenames)
		#return
		for item in remotenames:
			filetype = item[0]
			filename = item[1]
			local = os.path.join(localdir, filename)
			if filetype == 'd':
				self.download_files(local, filename)
			elif filetype == '-':
				self.download_file(local, filename)
		self.ftp.cwd('..')
		debug_print('返回上层目录 %s' %self.ftp.pwd())
	def upload_file(self, localfile, remotefile):
		if not os.path.isfile(localfile):
			return
		if self.is_same_size(localfile, remotefile):
		 	debug_print('跳过[相等]: %s' %localfile)
		 	return
		file_handler = open(localfile, 'rb')
		self.ftp.storbinary('STOR %s' %remotefile, file_handler)
		file_handler.close()
		debug_print('已传送: %s' %localfile)
	def upload_files(self, localdir='./', remotedir = './'):
		if not os.path.isdir(localdir):
			return
		localnames = os.listdir(localdir)
		self.ftp.cwd(remotedir)
		for item in localnames:
			src = os.path.join(localdir, item)
			if os.path.isdir(src):
				try:
					self.ftp.mkd(item)
				except:
					debug_print('目录已存在 %s' %item)
				self.upload_files(src, item)
			else:
				self.upload_file(src, item)
		self.ftp.cwd('..')

	def get_file_list(self, line):
		ret_arr = []
		file_arr = self.get_filename(line)
		if file_arr[1] not in ['.', '..']:
			self.file_list.append(file_arr)
			
	def get_filename(self, line):
		pos = line.rfind(':')
		while(line[pos] != ' '):
			pos += 1
		while(line[pos] == ' '):
			pos += 1
		file_arr = [line[0], line[pos:]]
		return file_arr
def debug_print(s):
	print (s)
def deal_error(e):
	timenow  = time.localtime()
	datenow  = time.strftime('%Y-%m-%d', timenow)
	logstr = '%s 发生错误: %s' %(datenow, e)
	debug_print(logstr)
	file.write(logstr)
	sys.exit()

if __name__ == '__main__':
	file = open("log.txt", "a")
	timenow  = time.localtime()
	datenow  = time.strftime('%Y-%m-%d', timenow)
	logstr = datenow
	# 配置如下变量
	hostaddr = 'localhost' # ftp地址
	username = 'test' # 用户名
	password = 'test' # 密码
	port  =  21   # 端口号 
	rootdir_local  = '.' + os.sep + 'bak/' # 本地目录
	rootdir_remote = './'          # 远程目录
	
	f = MYFTP(hostaddr, username, password, rootdir_remote, port)
	f.login()
	f.download_files(rootdir_local, rootdir_remote)
	
	timenow  = time.localtime()
	datenow  = time.strftime('%Y-%m-%d', timenow)
	logstr += " - %s 成功执行了备份\n" %datenow
	debug_print(logstr)
	
	file.write(logstr)
	file.close()
2
0
分享到:
评论

相关推荐

    python写的FTP下载工具 支持递归下载

    python写的FTP下载工具 支持递归下载

    Python实现FTP上传文件或文件夹实例(递归)

    本文介绍了一个 Python 实现 FTP 上传文件或文件夹的实例,通过定义类和方法的方式,实现了 FTP 服务器的连接、文件上传以及文件夹的递归上传等功能。这对于需要自动化上传文件或文件夹的场景非常有用。此外,还介绍...

    python FTP上传下载脚本

    支持上传,下载ftp的文件,备份,递归。

    ftpdown:使用python递归下载ftp目录

    总之,FTPdown是一个利用Python的`ftplib`库实现的FTP递归下载工具,它能够自动化下载FTP服务器上的目录及其所有子目录,提高了处理大量FTP文件的效率,并且具有一定的错误处理和定制化能力。通过理解和使用这样的...

    python实现FTP循环上传文件

    本文实例为大家分享了python实现FTP循环上传文件的具体代码,供大家参考,具体内容如下 测试过程中,有时会用到FTP的数据流,...class Transmitter(object): # 注意:递归上传本地文件或dirs到ftp服务器 def __init__

    python ftp 按目录结构上传下载的实现代码

    要支持目录下载,你需要修改 `ftp_download` 函数,使其能够递归地创建本地目录并下载所有文件,类似于 `ftp_upload` 函数中的 `__ftp_upload` 辅助函数。 此外,为了安全起见,建议使用环境变量或配置文件来存储...

    多线程实现ftp客户端程序

    总的来说,多线程实现的FTP客户端程序通过并行处理多个任务,提高了文件操作的效率,提供了更高效的文件传输体验。在实际开发过程中,需要兼顾性能优化、线程安全和用户体验,确保程序的稳定性和可靠性。

    ftp文件递归下载到本地/合并文件/分析数据

    FTP递归下载是指从FTP服务器上获取目录及其所有子目录中的所有文件和子目录的过程。这通常通过FTP客户端软件实现,如`lftp`或`WinSCP`,它们支持递归模式来下载整个目录结构。在Python中,可以使用`ftplib`模块实现...

    python实现从ftp上下载文件的实例方法

    另外,还给出了一个扩展的实例,该实例支持递归目录操作,适用于批量下载或上传文件。 在实际应用中,你需要将`'host'`、`'username'`、`'pwd'`以及文件路径等替换为实际的FTP服务器信息和文件路径。这个例子提供了...

    python实现从ftp服务器下载文件

    Python 实现从FTP服务器下载文件是一项常见的任务,尤其在数据迁移、备份或者远程协作中非常有用。以下将详细讲解如何使用Python的`ftplib`模块来实现这一功能,并结合给出的代码片段进行解析。 首先,我们需要导入...

    详解Python下ftp上传文件linux服务器

    通过Python的`ftplib`模块,我们可以方便地实现FTP客户端的功能,包括上传、下载、列出目录内容以及管理远程文件等。本篇文章主要讲解如何使用Python的`ftplib`模块上传文件到Linux服务器。 首先,我们需要导入`...

    Python-230OOB一个通过FTP实现文件读取的python脚本

    为了实现更高级的功能,例如列出服务器上的所有文件或递归下载整个目录,我们可以使用`NLST`命令获取目录列表,然后遍历列表进行操作。另外,如果服务器支持,可以使用`MLSD`命令获取更详细的文件信息。 总的来说,...

    python FTP批量下载/删除/上传实例

    Python FTP库提供了对FTP(File Transfer Protocol)服务器的访问,使得在Python程序中进行文件的下载、删除和上传变得十分便捷。以下是对标题和描述中所述知识点的详细说明: 1. **FTP链接**: 在Python中,我们...

    Python FTP两个文件夹间的同步实例代码

    总之,Python的`ftplib`模块提供了丰富的功能来处理FTP通信,结合文件系统操作,可以轻松实现文件夹的同步,无论是本地还是远程FTP服务器。在开发这样的工具时,确保代码的健壮性和效率是非常重要的,以适应不同的...

    Python实现可配置的sftp传输

    该资源为python实现可配置的sftp传输,get和put 配置文件为.ini文件;put和get区分一下源和目的路径,基本配置项即说明如下: [ftp]:ftp基本信息 [common] 公共的配置 如日志信息,传输模式,是否递归,是否删除等 ...

    FTP文件夹上传及断点续传

    6. 上传文件和子文件夹:对每个文件执行PUT操作,对每个子文件夹执行MKD(Make Directory)操作,然后递归上传子文件夹内容。 二、断点续传 断点续传是在上传或下载过程中,如果因网络问题或其他原因中断,可以从...

    ftputil python

    3. **递归操作**:ftputil支持递归地处理目录,比如遍历整个远程目录树,这对于文件同步或批量操作非常有用。 4. **错误处理和异常**:ftputil封装了FTP错误,将其转化为Python异常,如`ftputil.error.FTPError`,...

Global site tag (gtag.js) - Google Analytics