python3写的简单本地文件上传服务器实例
这篇文章主要介绍了关于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更新记录或者别的方案。
相关推荐:
以上是python3写的简单本地文件上传服务器实例的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

打开微信,在我中选择设置,选择通用后选择存储空间,在存储空间选择管理,选择要恢复文件的对话选择感叹号图标。教程适用型号:iPhone13系统:iOS15.3版本:微信8.0.24解析1首先打开微信,在我的页面中点击设置选项。2接着在设置页面中找到并点击通用选项。3然后在通用页面中点击存储空间。4接下来在存储空间页面中点击管理。5最后选择要恢复文件的对话,点击右侧的感叹号图标。补充:微信文件一般几天过期1要是微信接收的文件并没有点开过的情况下,那在七十二钟头之后微信系统会清除掉,要是己经查看了微信

在Windows系统中,照片应用是一个便捷的方式来查看和管理照片和视频。通过这个应用程序,用户可以轻松访问他们的多媒体文件,而无需安装额外的软件。然而,有时候用户可能会碰到一些问题,比如在使用照片应用时遇到“无法打开此文件,因为不支持该格式”的错误提示,或者在尝试打开照片或视频时出现文件损坏的问题。这种情况可能会让用户感到困惑和不便,需要进行一些调查和修复来解决这些问题。当用户尝试在Photos应用程序上打开照片或视频时,会看到以下错误。抱歉,照片无法打开此文件,因为当前不支持该格式,或者该文件

在本文中,我们将介绍如何解决在Windows系统中删除文件或文件夹时出现“准备删除”提示的问题。这个提示意味着系统正在进行一些后台操作,如检查文件权限、验证文件是否被其他程序占用、计算要删除项目的大小等。我们将为您提供一些解决方法,以确保您能够顺利删除文件,而无需等待太长时间。为什么Windows要花这么长时间才能删除文件?Windows准备删除文件所需的时间受多种因素影响,包括文件大小、存储设备速度和后台进程。长时间或被卡住的“正在准备删除”提示可能暗示系统资源不足、磁盘错误或文件系统问题。在

Tmp格式文件是一种临时文件格式,通常由计算机系统或程序在执行过程中生成。这些文件的目的是存储临时数据,以帮助程序正常运行或提高性能。一旦程序执行完成或计算机重启,这些tmp文件往往就没有了存在的必要性。所以,对于Tmp格式文件来说,它们本质上是可以删除的。而且,删除这些tmp文件能够释放硬盘空间,确保计算机的正常运行。但是,在删除Tmp格式文件之前,我们需

在电脑中删除或解压缩文件夹,时有时候会弹出提示对话框“错误0x80004005:未指定错误”,如果遇到这中情况应该怎么解决呢?提示错误代码0x80004005的原因其实有很多,但大部分因为病毒导致,我们可以重新注册dll来解决问题,下面,小编给大伙讲解0x80004005错误代码处理经验。有用户在使用电脑时出现错误代码0X80004005的提示,0x80004005错误主要是由于计算机没有正确注册某些动态链接库文件,或者计算机与Internet之间存在不允许的HTTPS连接防火墙所引起。那么如何

gho文件是一种GhostImage影像文件,它通常用于将整个硬盘或分区的数据备份成一个文件。在一些特定的情况下,我们需要将这种gho文件重新安装回硬盘上,以还原硬盘或分区到先前的状态。下面将介绍gho文件的安装方法。首先,在安装之前,我们需要准备以下工具和材料:实体的gho文件:确保你拥有一份完整的gho文件,它通常以.gho为后缀名,并且包含有备份

夸克网盘和百度网盘都是现在最常用的储存文件的网盘软件,如果想要将夸克网盘内的文件保存到百度网盘,要怎么操作呢?本期小编整理了夸克网盘电脑端的文件转移到百度网盘的教程步骤,一起来看看是怎么操作吧。 夸克网盘的文件怎么保存到百度网盘?要将夸克网盘的文件转移到百度网盘,首先需在夸克网盘下载所需文件,然后在百度网盘客户端中选择目标文件夹并打开。接着,将夸克网盘中下载的文件拖放到百度网盘客户端打开的文件夹中,或者使用上传功能将文件添加至百度网盘。确保上传完成后在百度网盘中查看文件是否成功转移。这样就

文件路径是操作系统中用于识别和定位文件或文件夹的字符串。在文件路径中,常见的有两种符号分隔路径,即正斜杠(/)和反斜杠()。这两个符号在不同的操作系统中有不同的使用方式和含义。正斜杠(/)是Unix和Linux系统中常用的路径分隔符。在这些系统中,文件路径是以根目录(/)为起始点,每个目录之间使用正斜杠进行分隔。例如,路径/home/user/Docume
