`

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上传文件或文件夹实例(递归),具有一定的参考价值,有兴趣的可以了解一下。

    python FTP上传下载脚本

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

    python实现FTP循环上传文件

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

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

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

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

    ftp自动下载、自动上传脚本,可以递归目录操作 ''' from ftplib import FTP import os,sys,string,datetime,time import socket class MYFTP: def __init__(self, hostaddr, username, password, remotedir, port=...

    Python实现可配置的sftp传输

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

    python递归下载文件夹下所有文件

    最近想备份网站,但是php下载文件的大小是有大小限制的,而我也懒得装ftp再下载了,就想着暂时弄个二级域名站,然后用python(python3)的requests库直接下载网站根目录下的所有文件以及文件夹。(0-0就是这么任性) 1...

    Python FTP操作类代码分享

    ””’ ftp自动下载、自动上传脚本,可以递归目录操作”’  from ftplib import FTPimport os, sys, string, datetime, timeimport socket  class FtpClient:  def __init__(self, host, user, passwd, ...

    Python核心编程第二版

     1.4 下载和安装Python   1.5 运行Python   1.5.1 命令行上的交互式解释器   1.5.2 从命令行启动脚本   1.5.3 集成开发环境   1.5.4 其他的集成开发环境和执行环境   1.6 Python文档   1.7 ...

    python入门到高级全栈工程师培训 第3期 附课件代码

    01 selctors实现文件上传与下载 02 html的介绍 03 html文档树的概念 04 meta标签以及一些基本标签 05 img标签和列表标签 06 form表单之input标签 07 通过form向server端发送数据 08 form表单之select标签 09 table...

    Python核心编程第二版(ok)

     1.4 下载和安装Python   1.5 运行Python   1.5.1 命令行上的交互式解释器   1.5.2 从命令行启动脚本   1.5.3 集成开发环境   1.5.4 其他的集成开发环境和执行环境   1.6 Python文档   1.7 ...

    最新Python3.5零基础+高级+完整项目(28周全)培训视频学习资料

    多用户在线Ftp程序 第9周 上节回顾 paramiko模块详解 ssh密钥讲解 进程与线程 多线程 多线程案例 主线程与子线程 线程锁 线程之信号量 线程之Event 队列Queue 作业之主机批量管理 第10周 心灵分享 上节回顾 多...

    Python文件系统抽象层PyFilesystem.zip

    下面是一个递归统计文件夹中代码行数的例子:count_python_loc 函数中的参数 fs 是一个FS对象,它包含了你需要对文件系统进行的全部操作。由于这样的高度抽象,同一段代码可以用于任何一个文件系统。例如,你需要...

    devdemo.zip

    使用python+django框架实现ftp登陆,并遍历远程父目录及递归查询子目录所有文件,可以搭建Nginx+uwsgi或者单独通过python运行均可

    pyfilesystem2:Python的文件系统抽象层

    它以递归方式工作,因此它将在所有子目录中找到.py文件。 def count_python_loc ( fs ): """Count non-blank lines of Python code.""" count = 0 for path in fs . walk . files ( filter = [ '*.py' ]): ...

    code:我多年来编写的有用的Perl和Python代码

    代码这是我多年来编写的有用的Perl和Python... 还包括我为《 Perl期刊》写的文章“ FTP站点的递归遍历”(后来成为O'Reilly的书《 。Python 包括我的Python Power Tools集合,该集合以纯Python实现的Unix相似工作命令。

    PS4_DB_Rebuilder_5.05-7.02:Ps4内置数据库重建器具有从数据库中删除fpkg的趋势。 这将用它们重新填充数据库!

    递归克隆( git clone <url> --recursive )此仓库或下载 在PS4上启动FTP服务器 通过terminal / cmdline运行python脚本: 版本 命令 5.05 python3 fix_db.py [PS4_IP] --fw 5.05 6.72 python3 fix_db.py [PS4_...

Global site tag (gtag.js) - Google Analytics