python3写的简单本地文件上传服务器实例
作者:自由的程序猿 发布时间:2023-08-23 02:50:58
标签:python3,文件,上传,服务器
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更新记录或者别的方案。
来源:https://blog.csdn.net/a61595579/article/details/78667276


猜你喜欢
- # -*- coding: utf-8 -*-# @Author: CriseLYJ# @Date: 2020-08-14 12
- Python 是一门动态、面向对象语言。其最初就是作为一门面向对象语言设计的,并且在后期又加入了一些更高级的特性。除了语言本身的设计目的之外
- MySQL分区方便了我们的使用,但是MySQL分区究竟能做些什么,MySQL分区有没有什么限制呢?阅读下文,您就能找到答案。MySQL分区能
- 前言MySQL是目前非常流行的数据库之一,也是中小企业持久化存储的首选数据库。不同于我们日常学习,在实际应用中,MySQL服务都会挂载在某台
- 一 什么是XML?python与json数据的交互详情 在这篇文章中我们介绍了json是一种独立于编程语言和平台的数据存储和交换方
- python 如何获取文件夹中的全部文件在神经网络准备训练集的时候,经常需要从文件夹中读取全部图片。经常遇到的有两种方式1 os.listd
- 申明本博客不提供任何服务器端程序,也不提供任何收费抢购软件。该博客仅用于学习selenium自动化工具。如有侵犯到任何公司的合法权益,请私信
- 执行 datax 作业,创建执行文件,在 crontab 中每天1点(下面有关系)执行:其中 job_start 及 job_finish
- 一、内置函数下面简单介绍几个:1.abs() 求绝对值2.all() 如果 iterable 的所有元素都为真(或者如果可迭代为空),则返回
- 在开始之前,先问问大家:什么是百度Aip模块?百度AI平台提供了很多的API接口供开发者快速的调用运用在项目中本文写的是使用百度AI的**在
- 本文实例为大家分享了python实现录音功能的具体代码,供大家参考,具体内容如下# -*- coding: utf-8 -*-import
- 背景:最近在做vue的项目,因为页面的逻辑比较复杂,代码量较多,所以就想抽离出一些组件放到component里面。问题就随之来了。因为vue
- 题目:轮盘分为三部分: 一等奖, 二等奖和三等奖;轮盘转的时候是随机的,如果范围在[0,0.08)之间,代表一等奖,如果范围在[0.08,0
- 实现代码/// <summary>/// 去除HTML标记/// </summary&
- 此模块允许你输出类似Unix cal程序的日历,并提供与日历相关的其他有用功能。值得注意的是,默认情况下,这些日历将星期一作为一
- python里面的matplotlib.pylot是大家比较常用的,功能也还不错的一个包。基本框架比较简单,但是做一个功能完善且比较好看整洁
- What do the ->, => and :: symbols mean?The -> is the "in
- 本文实例讲述了Python实现曲线拟合操作。分享给大家供大家参考,具体如下:这两天学习了用python来拟合曲线。一、环境配置本人比较比较懒
- 用 docx 模块读取 Worddocx 安装cmd 中输入pip install python-docx 即可安装 docx 模块docx
- 做机器学习的一定对支持向量机(support vecto