1. 背景

最近接到一个产品需求是给指定的 sftp 服务器的指定目录定时推送文件数据。

因为项目组已有现成的组件可以轻松实现 sftp 服务器文件的快速上传,本来是一件很容易的事情,但是问题出现在这个指定的 sftp 服务器所指定的密码带有系统关键字和一些特殊字符,导致现在的组件在解析过程中会失败。

因此重新开发了下面的这套脚本来满足这个特殊的需求。

2. 代码实现

Python代码

#test_upload.py
import os, sys
import yaml
from optparse import OptionParser
import paramiko
import tracebackopt_parser = OptionParser()
opt_parser.add_option('--node', action='store', type='string', dest='node', help='sftp config')
opt_parser.add_option('--local_file', action='store', type='string', dest='local_file',  help='file to be transferred')def load_config_from_param_conf(key):""":param key: 指定业务所使用的sftp服务的名称,例如sftp.yaml文件中的key: test_file_upload:return: 从指定路径拿到yaml文件并读取指定key,返回例如sftp.yaml文件中key为test_file_upload下的配置选项值包含: host,port,user,password,destination"""config_file = f'{os.environ["TASK_MAIN"]}/test_conf/sftp.yaml' #获取指定路径下的yaml文件with open(config_file, 'r') as r: #打开yaml文件内容config = yaml.load(r) #转换yaml数据为字典return config['sftp']['upload'][key]def upload(sftp_conf, local_file_path):""":param sftp_conf: 获取指定sftp_conf=test_file_upload下返回的字典值,这里的参数sftp_conf与load_config_from_param_conf函数里的参数值一致:param local_file_path: 指定本地要上传到sftp服务器的文件的绝对路径:return:"""sf = paramiko.Transport((sftp_conf['host'], sftp_conf['port']))sf.connect(username=sftp_conf['user'], password=sftp_conf['password'])sftp = paramiko.SFTPClient.from_transport(sf)to_path = sftp_conf['destination']sftp.put(local_file_path, to_path + os.sep + os.path.split(local_file_path)[-1], confirm=False)sftp.close()if __name__ == '__main__':option = opt_parser.parse_args(sys.argv[1:])[0]sftp_conf = load_config_from_param_conf(option.node)try:upload(sftp_conf, option.local_file)except Exception as e:print(traceback.format_exc())raise Exception('upload {} file error.'.format(option.local_file))

sftp配置文件代码

#sftp.yaml
sftp:upload:test_file_upload:host: 10.12.34.6port: 808user: user_testpassword: 8Z.Lx/2@UHdestination: /data/dump

3. 代码分析

(1). yaml 模块

import yaml

导入 yaml 模块前可以使用以下命令进行模块的安装

python3 -m pip install PyYaml

yaml 模块在这里的作用是读取 sftp 配置文件代码,将指定key: test_file_upload 下的 key:value 的值转换为字典。

例如:load_config_from_param_conf 函数中的返回值就是使用 yaml 读取到 sftp 配置文件代码后,返回 key: test_file_upload 下配置选项值。

格式如下:

{ "host": "10.12.34.6","port": "808","user": "user_test","password": "8Z.Lx/2@UH","destination": "/data/dump"
}

最后将返回值传给 upload 函数作为参数。

(2). OptionParser 模块

from optparse import OptionParser

按照 yaml 模块的安装方法,先安装 optparse 模块后,然后在文件中从optparse 中导入 OptionParser 模块

opt_parser = OptionParser()
opt_parser.add_option('--node', action='store', type='string', dest='node', help='sftp config')
opt_parser.add_option('--local_file', action='store', type='string', dest='local_file',  help='file to be uploaded')

在这里我使用了 OptionParser 这个类实例化了一个对象:opt_parser,通过对象来调用 add_option 方法添加了2个参数,分别是:node, local_file

1). 形参:–node,实参:node

所代表的业务含义是:指定要上传的 sftp 的节点,具体参数值对应 sftp配置文件代码中的 test_file_upload

2). 形参:–local_file,实参:local_file

所代表的业务含义是:指定本地需要被上传到 sftp 服务器的具体文件路径

3). 调用命令

python3 test_upload.py --node test_file_upload --local_file /home/test/sftp_load/test_001.csv
4). add_option()方法

add_option()参数说明:

action: 存储方式,分别为:store,store_false,store_truetype: 类型dest: 存储的变量default: 默认值help: 帮助信息

参数:action的枚举

store: 参数列表中带有–node, 那么就会将下一个元素即:test_file_upload 作为其 dest 实参 node 的值; 如果没有–node,那么对应的node的值就为 None;

store_true: 参数列表中有–local_file, 那么其 dest 实参 local_file 的值就为 True; 否者就为 default 定义的默认值,这里没有给定 default 的默认值;

store_false: 参数列表中有–local_file, 那么其 dest 实参 local_file 的值就为 False; 否者就为 default 定义的默认值,这里没有给定 default 的默认值;

参数:type

type是指定传入参数的类型,这里的参数类型为 string 类型。

参数:dest

dest是参数传入后由哪个变量来存储的,后面代码对该参数的引用也是使用这里定义的变量名来引用的。

参数:default

default 是与 action 的值结合使用的。

当action=store_true时,default=123时,如果有传入形参–local_file,则实参local_file的值为:True

当action=store_true时,default=123时,如果没有传入形参–local_file,则实参local_file的值为:123

当action=store_false时,default=123时,如果有传入形参–local_file,则实参local_file的值为:False

当action=store_false时,default=123时,如果没有传入形参–local_file,则实参local_file的值为:123

参数:help

help相当于帮助说明文档,用于描述这个参数的含义。


这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。

关注我的微信公众号:【伤心的辣条】自行获取~

我的自动化测试之路,一路走来都离不每个阶段的计划,因为自己喜欢规划和总结,所以,我和朋友花了一段时间整理编写了《软件测试工程师发展规划路线》,也整理了不少【教程资源】,打包好了分享在群里面。有需要的朋友可以进群:914172719 获取。希望会给你带来帮助和方向

喜欢软件测试的小伙伴们,如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!

仅20行代码,实现文件自动化上传。相关推荐

  1. python随机生成大写字母_python随机生成大小写字母数字混合密码(仅20行代码)

    用简单的方法生成随机性较大的密码 仅用20行代码随机生成密码 核心思路:利用random模块 random模块随机生成数字,大小写字母,循环次数 while循环+随机生成的循环次数-->随机pl ...

  2. ASP实例:6行代码实现无组件上传

    ASP实例:6行代码实现无组件上传 目前有很多无组件上传类,我大概看了一下,大多写的相当复杂,有的居然还只能传文本 最关键的是没有10行代码以下的 :) 我花了一个晚上时间研究了一下ADODB.Str ...

  3. 几行代码实现SpringBoot图片上传

    首先创建一个SpringBoot项目. 创建一个SpringBoot项目 创建成功后在静态志愿目录下会产生static template 目录 当我们的SpringBoot项目启动时会自动配置好静态资 ...

  4. python hsv inrange 范围_仅20行代码,用python给证件照换底色

    1.图片来源 该图片来源于百度图片,如果侵权,请联系我删除!图片仅用于知识交流.本文只是为了告诉大家:python其实有很多黑科技(牛逼的库),我们既可以用python处理工作中的一些事儿,同时我们也 ...

  5. php批量上传代码,文件批量上传_php文件上传代码(支持文件批量上传)

    摘要 腾兴网为您分享:php文件上传代码(支持文件批量上传),雨课堂版,洋游码头,学堂里,小度等软件知识,以及电脑硬件温度检测软件,日事清app,lol韩服语音包,绝地求生无后座力设置,金山u盘卫士, ...

  6. Python用20行代码实现完整邮件功能 [完整代码+建议收藏]

    大家好,我是Lex 喜欢欺负超人那个Lex 擅长领域:python开发.网络安全渗透.Windows域控Exchange架构 今日重点:python脚本实现发送邮件,邮件添加附件,读取接收邮件等功能. ...

  7. 人脸检测算法代码python_Python有多强大!20行代码实现人脸检测与识别

    题记:大二的时候发现人生苦短,所以信了拍神,开始学Python.学了大半年之后成功转行做前端了.来写个教程帮助大家入门Python. Python优点 Python是一种简单易学.功能强大的编程语言, ...

  8. 20行代码发一篇NeurIPS:梯度共享已经不安全了

    整理 | 夕颜,Jane 出品 | AI科技大本营(ID:rgznai100) [导读]12 月 8 日-14 日,NeurIPS 2019 在加拿大温哥华举行,和往常一样,今年大会吸引了数万名专家参 ...

  9. 《看聊天记录都学不会C语言?太菜了吧》(14)这么神奇?我写了20行代码竟然一行就可以搞定?

    好消息2020年4月13日晚7.30我在CSDN开播,等你来聊天 预约连接:https://live.csdn.net/room/A757291228/MJWK0Gem 本系列文章将会以通俗易懂的对话 ...

最新文章

  1. 朱敏:40岁创业如何成就绝代明星?(五)
  2. Partition Tables介绍及分区表转换
  3. SQLite数据库管理工具(SQLiteStudio)v3.1.1
  4. docker 安装oracle_rancher安装oracle 11g
  5. Dubbo 面试题汇总(附答案)
  6. Linux下 查找大文件
  7. php饼图只有一个小方块_如何用Python画一个好看的饼图
  8. 某学校有计算机主机1300台,《计算机应用基础》1300题一级考试练习题
  9. python hadoop_让python在hadoop上跑起来
  10. iOS-屏幕适配-UI布局
  11. android 考勤界面,一种android终端实时考勤记录统计展现方法和装置与流程
  12. 知识图谱应用在金融行业的地方
  13. 【论文复刻】高技术企业认证政策是否促进了中国创新?(heckman两阶段模型 PSM-DID)论文复现
  14. latex 小于_小于等于 latex
  15. 踩坑指南!pytorch1.2.0安装!又是猛男落泪的一天!
  16. AlertDialog点击确定必定会dismiss问题
  17. SAP 记账凭证 更改 冲销
  18. 在内存只有10M的空间中申请一块5M的数组空间,会导致OOM吗?
  19. 基于80C51单片机——中断小结
  20. 手机无线网卡最高支持到866Mbps

热门文章

  1. 遗传算法求解装箱问题c语言,装箱或背包问题? (或者遗传算法解决)
  2. oracle vm win10,win10系统oraclevm卸载不了错误2503的解决方法
  3. C++用户自定义转换(User-Defined Conversion)
  4. TensorFlow:递归神经网络
  5. 基于 lumen 的微服务架构实践
  6. 2018年区块链将如何发展?
  7. windows 10 64位安装Python3.6.4
  8. 关于sources.list和apt-get [转载]
  9. SPLUNK 安装配置及常用语法
  10. linux epoll用法之二