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实现代码行数统计示例分享
Feb 10 Python
Python与R语言的简要对比
Nov 14 Python
[原创]教女朋友学Python3(二)简单的输入输出及内置函数查看
Nov 30 Python
Python实现的读写json文件功能示例
Jun 05 Python
Python实现平行坐标图的两种方法小结
Jul 04 Python
django的ORM操作 删除和编辑实现详解
Jul 24 Python
Django发送邮件和itsdangerous模块的配合使用解析
Aug 10 Python
python科学计算之numpy——ufunc函数用法
Nov 25 Python
python数字类型math库原理解析
Mar 02 Python
python实现人机五子棋
Mar 25 Python
Python学习之os模块及用法
Jun 03 Python
PyCharm+Miniconda3安装配置教程详解
Feb 16 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 include的妙用,实现路径加密
2008/07/29 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
2020/04/04 PHP
区分JS中的undefined,null,"",0和false
2007/03/08 Javascript
写js时遇到的一些小问题
2010/12/06 Javascript
JavaScript mapreduce工作原理简析
2012/11/25 Javascript
Egret引擎开发指南之编译项目
2014/09/03 Javascript
JavaScript两个变量交换值的实现方法
2017/03/01 Javascript
javaScript 逻辑运算符使用技巧整理
2017/05/03 Javascript
微信小程序城市定位的实现实例(获取当前所在国家城市信息)
2017/05/17 Javascript
Vue2 使用 Echarts 创建图表实例代码
2017/05/18 Javascript
JavaScript对象拷贝与Object.assign用法实例分析
2018/06/20 Javascript
详解微信小程序input标签正则初体验
2018/08/18 Javascript
javscript 数组扁平化的实现
2020/02/03 Javascript
linux系统使用python监控apache服务器进程脚本分享
2014/01/15 Python
深入理解 Python 中的多线程 新手必看
2016/11/20 Python
django rest framework之请求与响应(详解)
2017/11/06 Python
Python基于ThreadingTCPServer创建多线程代理的方法示例
2018/01/11 Python
python3+PyQt5实现柱状图
2018/04/24 Python
带你认识Django
2019/01/15 Python
python3 下载网络图片代码实例
2019/08/27 Python
Python调用钉钉自定义机器人的实现
2020/01/03 Python
解决tensorflow打印tensor有省略号的问题
2020/02/04 Python
Django自带用户认证系统使用方法解析
2020/11/12 Python
python中用Scrapy实现定时爬虫的实例讲解
2021/01/18 Python
CSS3 实现的缩略图悬停效果
2020/12/09 HTML / CSS
英国知名的皮手套品牌:Dents
2016/11/13 全球购物
乐高奥地利官方商店:LEGO Shop AT
2019/07/16 全球购物
毕业生找工作的求职信范文
2013/12/24 职场文书
个人自我剖析材料
2014/02/07 职场文书
毕业生个人求职自荐信
2014/02/26 职场文书
党员个人总结范文
2015/02/14 职场文书
企业党建工作总结2015
2015/05/26 职场文书
高一军训感想
2015/08/07 职场文书
在 SQL 语句中处理 NULL 值的方法
2021/06/07 SQL Server
html+css实现滚动到元素位置显示加载动画效果
2021/08/02 HTML / CSS
Android开发实现极为简单的QQ登录页面
2022/04/24 Java/Android