python3写的简单本地文件上传服务器实例


Posted in Python onJune 04, 2018

python是个很好玩的东西?好吧我随口说的,反正因为各种原因(其实到底是啥我也不知道),简单的学习了下python,然后写了一个上传文件上服务器的小玩具练手。

大概功能是这样:

1、获取本地文件列表(包括文件夹)

2、检查服务器上是否存在,不存在直接上传,存在的话,文件夹无视,文件比较大小,大小不一致则覆盖,最后检查服务器上是否存在本地没有的文件,存在则删除

3、之后增加了忽略列表,忽略文件类型

4、然后增加了重启tomcat,但是这个功能未进行测试

大概就是这个样子,哦了,丢代码丢代码

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os 
import os.path 
import paramiko
import datetime
import re

# 配置属性
config = {
	#本地项目路径
	'local_path' : '',
	# 服务器项目路径
	'ssh_path' : '',
	# 项目名
	'project_name' : '',
	# 忽视列表
	'ignore_list' : [],
	# ssh地址、端口、用户名、密码
	'hostname' : '',
	'port' : 22,
	'username' : '',
	'password' : '',
	# 是否强制更新
	'mandatory_update' : False,
	# 更新完成后是否重启tomcat
	'restart_tomcat' : False,
	# tomcat bin地址
	'tomcat_path' : '',
	# 被忽略的文件类型
	'ignore_file_type_list' : []
}

# 检查文件夹是否存在,不存在则创建
def check_folder(path):
	stdin, stdout, stderr = ssh.exec_command('find ' + path)
	result = stdout.read().decode('utf-8')
	if len(result) == 0 :
		print('目录 %s 不存在,创建目录' % path)
		ssh.exec_command('mkdir ' + path)
		print('%s 创建成功' % path)
		return 1
	else:
		print('目录 %s 已存在' % path)
		return 0

# 检查文件是否存在,不存在直接上传,存在检查大小是否一样,不一样则上传
def check_file(local_path, ssh_path):
	# 检查文件是否存在,不存在直接上传
	stdin, stdout, stderr = ssh.exec_command('find ' + ssh_path)
	result = stdout.read().decode('utf-8')
	if len(result) == 0 :
		sftp.put(local_path,ssh_path)
		print('%s 上传成功' % (ssh_path))
		return 1
	else:
		# 存在则比较文件大小
		# 本地文件大小
		lf_size = os.path.getsize(local_path)
		# 目标文件大小
		stdin, stdout, stderr = ssh.exec_command('du -b ' + ssh_path)
		result = stdout.read().decode('utf-8')
		tf_size = int(result.split('\t')[0])
		print('本地文件大小为:%s,远程文件大小为:%s' % (lf_size, tf_size))
		if lf_size == tf_size:
			print('%s 大小与本地文件相同,不更新' % (ssh_path))
			return 0
		else:
			sftp.put(local_path,ssh_path)
			print('%s 更新成功' % (ssh_path))
			return 1

# 上传流程开始
print('上传开始')
begin = datetime.datetime.now()

# 文件夹列表
folder_list = []
# 文件列表
file_list = []
# ssh上文件列表
ssh_file_list = []

for parent,dirnames,filenames in os.walk(config['local_path']+config['project_name']): 
 #初始化文件夹列表
 for dirname in dirnames:
 	p = os.path.join(parent,dirname)
 	folder_list.append(p[p.find(config['project_name']):])
 #初始化文件列表
 for filename in filenames:
 	if config['ignore_list'].count(filename) == 0:
 		p = os.path.join(parent,filename)
 		file_list.append(p[p.find(config['project_name']):])

print('共有文件夹%s个,文件%s个' % (len(folder_list),len(file_list)))

# ssh控制台
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=config['hostname'], port=config['port'], username=config['username'], password=config['password'])
# ssh传输
transport = paramiko.Transport((config['hostname'],config['port']))
transport.connect(username=config['username'],password=config['password'])
sftp = paramiko.SFTPClient.from_transport(transport)

# 检查根目录是否存在
root_path = config['ssh_path'] + config['project_name']
stdin, stdout, stderr = ssh.exec_command('find ' + root_path)
result = stdout.read().decode('utf-8')
if len(result) == 0 :
	print('目录 %s 不存在,创建目录' % root_path)
	ssh.exec_command('mkdir ' + root_path)
	print('%s 创建成功' % root_path)
else:
	print('目录 %s 已存在,获取所有文件' % root_path)
	ssh_file_list = re.split('\n',result)

# 检查文件夹
create_folder_num = 0
for item in folder_list:
	target_folder_path = config['ssh_path'] + item
	create_folder_num = create_folder_num + check_folder(target_folder_path)

# 检查文件
update_file_num = 0
for item in file_list:
	if config['ignore_file_type_list'].count(os.path.splitext(item)[1]) == 0:
		local_file_path = config['local_path'] + item
		target_file_path = config['ssh_path'] + item
		if config['mandatory_update']:
			sftp.put(local_file_path,target_file_path)
			print('%s 强制更新成功' % (target_file_path))
			update_file_num = update_file_num + 1
		else:
			update_file_num = update_file_num + check_file(local_file_path, target_file_path)
	else:
		print('%s 在被忽略文件类型中,所以被忽略' % item)

# 检查ssh是否有需要删除的文件
delete_file_num = 0
for item in ssh_file_list:
	temp = item[item.find(config['project_name']):]
	if folder_list.count(temp) == 0 and file_list.count(temp) == 0 and temp != config['project_name'] and temp != '':
		print('%s 在本地不存在,删除' % item)
		ssh.exec_command('rm -rf ' + item)
		delete_file_num = delete_file_num + 1

end = datetime.datetime.now()
print('本次上传结束:创建文件夹%s个,更新文件%s个,删除文件%s个,耗时:%s' % (create_folder_num, update_file_num, delete_file_num, end-begin))

if config['restart_tomcat']:
	print('关闭tomcat')
	ssh.exec_command('sh ' + config['tomcat_path'] + 'shutdown.sh')
	print('启动tomcat')
	ssh.exec_command('sh ' + config['tomcat_path'] + 'startup.sh')

# 关闭连接
sftp.close()
ssh.close()

最后加了个强制更新,即不管三七二十一只要不在忽略列表中直接上传覆盖,毕竟通过比较大小来更新文件有概率出问题,比如我把1改成2那么通过文件大小是无法对比出来的,如果之后有时间的话会琢磨下拉取git更新记录或者别的方案。

以上这篇python3写的简单本地文件上传服务器实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python基于scrapy采集数据时使用代理服务器的方法
Apr 16 Python
Python标准库defaultdict模块使用示例
Apr 28 Python
python psutil库安装教程
Mar 19 Python
Python使用crontab模块设置和清除定时任务操作详解
Apr 09 Python
python itchat实现调用微信接口的第三方模块方法
Jun 11 Python
python如何爬取网站数据并进行数据可视化
Jul 08 Python
TensorFlow基于MNIST数据集实现车牌识别(初步演示版)
Aug 05 Python
TensorFlow keras卷积神经网络 添加L2正则化方式
May 22 Python
Python实现数字的格式化输出
Aug 01 Python
如何利用python进行时间序列分析
Aug 04 Python
13个Pandas实用技巧,助你提高开发效率
Aug 19 Python
Python Selenium自动化获取页面信息的方法
Aug 31 Python
Python装饰器的执行过程实例分析
Jun 04 #Python
使用Python监控文件内容变化代码实例
Jun 04 #Python
Python操作mongodb的9个步骤
Jun 04 #Python
Python中property函数用法实例分析
Jun 04 #Python
使用Python快速搭建HTTP服务和文件共享服务的实例讲解
Jun 04 #Python
python最长回文串算法
Jun 04 #Python
python中字符串的操作方法大全
Jun 03 #Python
You might like
php 处理上百万条的数据库如何提高处理查询速度
2010/02/08 PHP
php echo()和print()、require()和include()函数区别说明
2010/03/27 PHP
PHP图片处理之使用imagecopyresampled函数裁剪图片例子
2014/11/19 PHP
php实现图片转换成ASCII码的方法
2015/04/03 PHP
深入浅析用PHP实现MVC
2016/03/02 PHP
如何解决PHP使用mysql_query查询超大结果集超内存问题
2016/03/14 PHP
php-beanstalkd消息队列类实例分享
2017/07/19 PHP
阿里云的WindowsServer2016上部署php+apache
2018/07/17 PHP
使用javascript访问XML数据的实例
2006/12/27 Javascript
JavaScript 判断浏览器类型及版本
2009/02/21 Javascript
javascript 写类方式之四
2009/07/05 Javascript
JSONP之我见
2015/03/24 Javascript
js使用cookie记录用户名的方法
2015/11/26 Javascript
关于两个jQuery(js)特效冲突的bug的解决办法
2016/09/04 Javascript
微信页面弹出键盘后iframe内容变空白的解决方案
2017/09/20 Javascript
微信小程序异步处理详解
2017/11/10 Javascript
AngularJS使用ng-repeat遍历二维数组元素的方法详解
2017/11/11 Javascript
JavaScript实现封闭区域布尔运算的示例代码
2018/06/25 Javascript
vue 中 beforeRouteEnter 死循环的问题
2019/04/23 Javascript
Vue3.0结合bootstrap创建多页面应用
2019/05/28 Javascript
es6 super关键字的理解与应用实例分析
2020/02/15 Javascript
vue项目前端微信JSAPI与外部H5支付相关实现过程及常见问题
2020/04/14 Javascript
vue过滤器实现日期格式化的案例分析
2020/07/02 Javascript
Pytorch在dataloader类中设置shuffle的随机数种子方式
2020/01/14 Python
python中matplotlib实现随鼠标滑动自动标注代码
2020/04/23 Python
Keras-多输入多输出实例(多任务)
2020/06/22 Python
python工具——Mimesis的简单使用教程
2021/01/16 Python
MaBelle玛贝尔香港官网:香港钻饰连锁店
2019/09/09 全球购物
Solaris操作系统的线程机制
2015/07/28 面试题
个人求职信范例
2014/01/29 职场文书
触电现场处置方案
2014/05/14 职场文书
党员干部作风建设思想汇报范文
2014/10/25 职场文书
材料员岗位职责
2015/02/10 职场文书
三严三实·严以用权心得体会
2016/01/12 职场文书
致创业您:正能量激励人心句子(48条)
2019/08/15 职场文书
如何使用flask将模型部署为服务
2021/05/13 Python