侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

Python  /  管理员 发布于 7年前   164

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

大概功能是这样:

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

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

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

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

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

#!/usr/bin/env python3# -*- coding: utf-8 -*-import os import os.path import paramikoimport datetimeimport 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 1else: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 1else:# 存在则比较文件大小# 本地文件大小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 0else: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 = 0for item in folder_list:target_folder_path = config['ssh_path'] + itemcreate_folder_num = create_folder_num + check_folder(target_folder_path)# 检查文件update_file_num = 0for item in file_list:if config['ignore_file_type_list'].count(os.path.splitext(item)[1]) == 0:local_file_path = config['local_path'] + itemtarget_file_path = config['ssh_path'] + itemif config['mandatory_update']:sftp.put(local_file_path,target_file_path)print('%s 强制更新成功' % (target_file_path))update_file_num = update_file_num + 1else:update_file_num = update_file_num + check_file(local_file_path, target_file_path)else:print('%s 在被忽略文件类型中,所以被忽略' % item)# 检查ssh是否有需要删除的文件delete_file_num = 0for 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 + 1end = 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实现requests发送/上传多个文件的示例
    下一条:
    Python装饰器的执行过程实例分析
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客