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 17 Python
python3.x实现发送邮件功能
May 22 Python
Django开发中的日志输出的方法
Jul 02 Python
Python箱型图处理离群点的例子
Dec 09 Python
手把手教你安装Windows版本的Tensorflow
Mar 26 Python
python requests.get带header
May 05 Python
pycharm中使用request和Pytest进行接口测试的方法
Jul 31 Python
Python 常用日期处理 -- calendar 与 dateutil 模块的使用
Sep 02 Python
python图片合成的示例
Nov 09 Python
python爬虫beautifulsoup解析html方法
Dec 07 Python
pytorch中Schedule与warmup_steps的用法说明
May 24 Python
Python实现天气查询软件
Jun 07 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编程中八种常见的文件操作方式
2006/11/19 PHP
php 远程图片保存到本地的函数类
2008/12/08 PHP
thinkPHP数据库增删改查操作方法实例详解
2016/12/06 PHP
laravel按天、按小时,查询数据的实例
2019/10/09 PHP
图片之间的切换
2006/06/26 Javascript
Javascript表单验证要注意的事项
2014/09/29 Javascript
深入探密Javascript数组方法
2015/01/08 Javascript
星期几的不同脚本写法(推荐)
2016/06/01 Javascript
JS产生随机数的几个用法详解
2016/06/22 Javascript
JS实现表单验证功能(验证手机号是否存在,验证码倒计时)
2016/10/11 Javascript
IntersectionObserver API 详解篇
2016/12/11 Javascript
vue小图标favicon不显示的解决方案
2017/09/19 Javascript
vue滚动轴插件better-scroll使用详解
2017/10/17 Javascript
Javascript中JSON数据分组优化实践及JS操作JSON总结
2017/12/22 Javascript
vue实现微信分享朋友圈,发送朋友的示例讲解
2018/02/10 Javascript
200行HTML+JavaScript实现年会抽奖程序
2019/01/22 Javascript
node静态服务器实现静态读取文件或文件夹
2019/12/03 Javascript
深入解析微信小程序开发中遇到的几个小问题
2020/07/11 Javascript
jQuery实现计算器功能
2020/10/19 jQuery
基于anaconda下强大的conda命令介绍
2018/06/11 Python
Python代理IP爬虫的新手使用教程
2019/09/05 Python
wxPython+Matplotlib绘制折线图表
2019/11/19 Python
Anaconda的安装及其环境变量的配置详解
2020/04/22 Python
python用Configobj模块读取配置文件
2020/09/26 Python
python 利用matplotlib在3D空间绘制二次抛物面的案例
2021/02/06 Python
CSS3 实现穿梭星空动画
2020/11/13 HTML / CSS
中西医结合临床医学专业大学生自荐信
2013/09/28 职场文书
借款协议书
2014/04/12 职场文书
岗位标兵事迹材料
2014/05/17 职场文书
2014个人年度工作总结
2014/12/15 职场文书
2015年师德师风承诺书
2015/01/22 职场文书
2015年小学二年级班主任工作总结
2015/05/21 职场文书
劳务派遣管理制度(样本)
2019/08/23 职场文书
教师节作文之小学四年级
2019/09/03 职场文书
Nginx安装完成没有生成sbin目录的解决方法
2021/03/31 Servers
Python进程间的通信之语法学习
2022/04/11 Python