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不带重复的全排列代码
Aug 13 Python
python结合opencv实现人脸检测与跟踪
Jun 08 Python
Python设计模式编程中Adapter适配器模式的使用实例
Mar 02 Python
python实现冒泡排序算法的两种方法
Mar 10 Python
python 实现查找文件并输出满足某一条件的数据项方法
Jun 12 Python
pyqt5 使用label控件实时显示时间的实例
Jun 14 Python
对python中的控制条件、循环和跳出详解
Jun 24 Python
通过实例了解python property属性
Nov 01 Python
Python多线程模块Threading用法示例小结
Nov 09 Python
Pycharm导入anaconda环境的教程图解
Jul 31 Python
python爬虫搭配起Bilibili唧唧的流程分析
Dec 01 Python
pytorch下的unsqueeze和squeeze的用法说明
Feb 06 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
星际中的相关伤害
2020/03/04 星际争霸
php获取当前网址url并替换参数或网址的方法
2010/06/06 PHP
PHP静态调用非静态方法的应用分析
2013/05/02 PHP
PHP实现的用户注册表单验证功能简单示例
2019/02/25 PHP
PHP 7.4 新语法之箭头函数实例详解
2019/05/09 PHP
PHP code 验证码生成类定义和简单使用示例
2020/05/27 PHP
jQuery ajax BUG:object doesn't support this property or method
2010/07/06 Javascript
jquery $.getJSON()跨域请求
2011/12/21 Javascript
js字符串引用的两种方式(必看)
2016/09/18 Javascript
基于复选框demo(分享)
2017/09/27 Javascript
jQuery中过滤器的基本用法示例
2017/10/11 jQuery
jQuery实现碰到边缘反弹的动画效果
2018/02/24 jQuery
react build 后打包发布总结
2018/08/24 Javascript
vue+elementUI实现图片上传功能
2019/08/20 Javascript
JavaScript实现省市联动效果
2019/11/22 Javascript
JS实现前端路由功能示例【原生路由】
2020/05/29 Javascript
[01:07]DOTA2次级职业联赛 - Fpb战队宣传片
2014/12/01 DOTA
值得收藏,Python 开发中的高级技巧
2018/11/23 Python
python sklearn常用分类算法模型的调用
2019/10/16 Python
python保存log日志,实现用log日志画图
2019/12/24 Python
Pytorch之卷积层的使用详解
2019/12/31 Python
python3 自动打印出最新版本执行的mysql2redis实例
2020/04/09 Python
python删除某个目录文件夹的方法
2020/05/26 Python
python合并多个excel文件的示例
2020/09/23 Python
英国二手iPhone、音乐、电影和游戏商店:musicMagpie
2018/10/26 全球购物
美国在线轮胎零售商:SimpleTire
2019/04/08 全球购物
C#中的验证控件有几种
2014/03/08 面试题
私营公司诉讼代理委托书范本
2014/09/13 职场文书
乡镇党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
护理医院见习报告
2014/11/03 职场文书
2015年团支部年度工作总结
2015/05/27 职场文书
歌剧魅影观后感
2015/06/05 职场文书
小学四年级作文之人物作文
2019/11/06 职场文书
python数字类型和占位符详情
2022/03/13 Python
Go微服务项目配置文件的定义和读取示例详解
2022/06/21 Golang
Java 中的 Lambda List 转 Map 的多种方法详解
2022/07/07 Java/Android