Python - 自动化办公,将yml根据转换规则转换成‘‘ = ‘‘

文章目录

  • 前言
    • ## Python - 自动化办公,将yml根据转换规则转换成'' = ''
      • 1. 准备工作
      • 2. demo
      • 3. 测试

前言

  如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
  而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


## Python - 自动化办公,将yml根据转换规则转换成’’ = ‘’

ruamel.yaml 是一个用于处理 YAML 文件的 Python 库。它是 PyYAML 的增强版,提供了更多的功能,特别是在处理 YAML 格式的复杂性和保留文件中的注释和格式方面。

1. 准备工作

yml文件:
在这里插入图片描述

server:port: 13145  # 默认端口tomcat:uri-encoding: UTF-8 # 默认编码
eureka:instance:prefer-ip-address: true # 优先ip注册client:service-url:defaultZone: http://127.0.0.1:8761/eureka # 注册中心地址down:url: http://127.0.0.1:19001/actuator/service-registry?status=DOWN
spring:application:name: testDemo # 项目名称servlet:multipart:    #上传配置enabled: truemax-file-size: 10MBmax-request-size: 20MBsession:           #session 超时设置timeout: 1800kafka:bootstrap-servers: 127.0.0.1:9092 #你kafka服务器地址listener:missing-topics-fatal: false # 消费端监听的topic不存在时,项目启动会报错(关掉)ack-mode: manual_immediate # 配置监听手动提交 ack ,消费一条数据完后,立即提交#生产者的配置,大部分我们可以使用默认的,这里列出几个比较重要的属性producer:#每批次发送消息的数量batch-size: 16#设置大于0的值将使客户端重新发送任何数据,一旦这些数据发送失败。#注意,这些重试与客户端接收到发送错误时的重试没有什么不同。允许重试将潜在的改变数据的顺序,#如果这两个消息记录都是发送到同一个partition,则第一个消息失败第二个发送成功,则第二条消息会比第一条消息出现要早。properties:partitioner:class: com.yzy.demo.kafka.partitioner.CustomizePartitioner  #自定义分区linger:ms: 0 # 当生产端积累的消息达到batch-size或接收到消息linger.ms后,生产者就会将消息提交给kafka ,当linger.ms为0表示每接收到一条消息就提交给kafka,这时候batch-size其实就没用了retries: 0#producer可以用来缓存数据的内存大小。如果数据产生速度大于向broker发送的速度,#producer会阻塞或者抛出异常,以“block.on.buffer.full”来表明。#这项设置将和producer能够使用的总内存相关,但并不是一个硬性的限制,#因为不是producer使用的所有内存都是用于缓存。一些额外的内存会用于压缩(如果引入压缩机制),同样还有一些用于维护请求。buffer-memory: 33554432acks: all#key序列化方式key-serializer: org.apache.kafka.common.serialization.StringSerializervalue-serializer: org.apache.kafka.common.serialization.StringSerializer#消费者的配置consumer:properties:session:timeout:ms: 120000 # 消费会话超时时间(超过这个时间consumer没有发送心跳,就会触发rebalance操作)request:timeout:ms: 180000 # 消费请求超时时间# 当kafka中没有初始offset或offset超出范围时将自动重置offset# earliest:重置为分区中最小的offset;# latest:重置为分区中最新的offset(消费分区中新产生的数据);# none:只要有一个分区不存在已提交的offset,就抛出异常;      auto-offset-reset: latest#是否开启自动提交enable-auto-commit: false#自动提交的时间间隔auto-commit-interval: 100#key的解码方式key-deserializer: org.apache.kafka.common.serialization.StringDeserializer#value的解码方式value-deserializer: org.apache.kafka.common.serialization.StringDeserializer#在/usr/local/etc/kafka/consumer.properties中有配置group-id: yzy #【你自己配置的】sgrain: #异步线程池async-thread-pool:enable: true  #异步线程池组件开关,默认falsecorePoolSize: 5 #核心线程数,默认:Java虚拟机可用线程数maxPoolSize: 10  #线程池最大线程数,默认:40000queueCapacity: 25  #线程队列最大线程数,默认:80000threadNamePrefix: yzy-Async-ThreadPool- #自定义线程名前缀,默认:Async-ThreadPool-keepAliveSeconds: 300 #线程池中线程最大空闲时间,默认:60,单位:秒allowCoreThreadTimeOut: false #核心线程是否允许超时,默认falsewaitForTasksToCompleteOnShutdown: false #IOC容器关闭时是否阻塞等待剩余的任务执行完成,默认:false(必须设置setAwaitTerminationSeconds)awaitTerminationSeconds: 10 #阻塞IOC容器关闭的时间,默认:10秒(必须设置setWaitForTasksToCompleteOnShutdown)main:allow-bean-definition-overriding: true #允许多个feign bean 存在datasource:dynamic: # druid连接池配置primary: master #默认数据源datasource:master: #主库配置username: YZY@7808423C343F447E85D1E0167DA1D0D3  #TESTDBpassword: YZY@7808423C343F447E85D1E0167DA1D0D3  #TESTDBdriver-class-name: ${datasource_driver_class_name:com.mysql.cj.jdbc.Driver}url: ${datasource_url:jdbc:mysql://127.0.0.1:3306/TESTDB?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC}druid:initial-size: 5 #启动程序时,在连接池中初始化多少个连接max-active: 20 #连接池中最多支持多少个活动会话min-idle: 5 #回收空闲连接时,将保证至少有minIdle个连接max-wait: 60000 #程序向连接池中请求连接时,超过maxWait的值后,认为本次请求失败,即连接池filters: stat,wall,slf4jslave: #从库配置username: YZY@7808423C343F447E85D1E0167DA1D0D3  #TESTDBpassword: YZY@7808423C343F447E85D1E0167DA1D0D3  #TESTDBdriver-class-name: ${datasource_driver_class_name:com.mysql.cj.jdbc.Driver}url: ${datasource_url:jdbc:mysql://127.0.0.1:3306/TESTDB?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC}druid:initial-size: 5 #启动程序时,在连接池中初始化多少个连接max-active: 20 #连接池中最多支持多少个活动会话min-idle: 5 #回收空闲连接时,将保证至少有minIdle个连接max-wait: 60000 #程序向连接池中请求连接时,超过maxWait的值后,认为本次请求失败,即连接池filters: stat,wall,slf4jrabbitmq: #RabbitMq 配置virtual-host: /host: 127.0.0.1  #IPpost: 5672  #提供服务时的端口username: guest #连接RabbitMQ的账户password: guest #连接RabbitMQ的密码
redisson:config:host: 127.0.0.1:6379database: 0  #redis索引timeout: 3000 #等待节点回复命令的时间。该时间从命令发送成功时开始计时minIdle: 8  #从节点发布到订阅连接的最小空闲连接数size: 64 #连接池配置数量rbloomfilter:key: redisson.rbloomfilter.key  #布隆过滤器key值
mybatis-plus:global-config:db-config:#逻辑已删除值logic-delete-value: 1#逻辑未删除值logic-not-delete-value: 0sql-parser-cache: true # 是否缓存 Sql 解析,默认不缓存configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpltype-enums-package: com.yzy.demo.*mapper-locations: classpath*:mapping/*/*Mapper.xml  #MyBatis Mapper 所对应的 XML 文件位置
zk:host: 127.0.0.1:2181  #ZooKeeper连接namespace: yzy_distributeLock #命名空间只是用来区别不同的项目
mq:env: loacl #自定义变量,表示本地开发yzy:info:queue:name: ${mq.env}.middleware.mq.yzy.info.queue.byte  #队列名称 字节接受name1: ${mq.env}.middleware.mq.yzy.info.queue.type  #队列名称 对象接受fanoutqueue:  #基于FanoutExchange的消息模型实战(队列)name: ${mq.env}.middleware.mq.yzy.info.fanoutqueue.one  #队列名称name1: ${mq.env}.middleware.mq.yzy.info.fanoutqueue.two  #队列名称topicqueue: #基于TopicExchange的消息模型实战(队列)name: ${mq.env}.middleware.mq.yzy.info.topicqueue.onename1: ${mq.env}.middleware.mq.yzy.info.topicqueue.twodirectqueue: #基于DirectExchange的消息模型中的队列name: ${mq.env}.middleware.mq.yzy.info.directqueue.onename1: ${mq.env}.middleware.mq.yzy.info.directqueue.twomanualqueue: #消息确认模式name: ${mq.env}.middleware.mq.yzy.info.manualqueue.onedeadqueue: #死信队列name:  ${mq.env}.middleware.mq.yzy.info.deadqueue.oneexchange:name: ${mq.env}.middleware.mq.yzy.info.exchange.byte  #交换机名称 字节接受name1: ${mq.env}.middleware.mq.yzy.info.exchange.type  #交换机名称 对象接受directexchange: #基于DirectExchange的消息模型中的交换机name: ${mq.env}.middleware.mq.yzy.info.directexchange.onefanoutExchange:  #基于FanoutExchange的消息模型实战(交换机)name: ${mq.env}.middleware.mq.yzy.info.fanoutExchangetopicexchange: ##基于TopicExchange的消息模型实战(交换机)name: ${mq.env}.middleware.mq.yzy.info.topicexchange.onemanualexchange: #消息确认模式name: ${mq.env}.middleware.mq.yzy.info.manualexchange.onedeadexchange:  #死信交换机name: ${mq.env}.middleware.mq.yzy.info.deadexchange.oneproducer: #死信队列模型中基本交换机中的名称name: ${mq.env}.middleware.mq.yzy.info.deadexchange.producer.onerouting:key:name: ${mq.env}.middleware.mq.yzy.info.routing.key.byte  #路由名称 字节接受name1: ${mq.env}.middleware.mq.yzy.info.routing.key.type  #路由名称 对象接受directrouting: #基于DirectExchange的消息模型中的路由key:name: ${mq.env}.middleware.mq.yzy.info.directrouting.key.onename1: ${mq.env}.middleware.mq.yzy.info.directrouting.key.twotopicrouting: #基于DirectExchange的消息模型中的路由key:name: ${mq.env}.middleware.mq.yzy.info.topicrouting.*.keyname1: ${mq.env}.middleware.mq.yzy.info.topicrouting.#.keymanualrouting:key: #确认模式name: ${mq.env}.middleware.mq.yzy.info.manualrouting.key.onedeadrouting: #死信路由key:name: ${mq.env}.middleware.mq.yzy.info.deadrouting.key.oneproducer: #死信消息模型中 基本模型中的路由key:name: ${mq.env}.middleware.mq.yzy.info.deadrouting.producer.key.one
config:rabbitmq:  #多个消费者实例配置,主要针对高并发业务场景配置factory:concurrentConsumers: 10  #设置并发消费者实例的初始值maxConcurrentConsumers: 15  #设置并发消费者实例的最大数量prefetchCount: 10  #置并发消费者实例中每个实例拉取的消息数量session:timeOut: 5 #缓存的超时时间sessionTimeOut: 2 #分布式 sessionId 的超时时间sessionKey: SESSION_KEY #存放cookie的sessionId的key值head: yzy_ #缓存中的命名前缀【防缓存雪崩设计】log:flag: truefilter: com.yzy,com.baomidou.mybatisplusconfigLoad: configdecrypt:key: Yzy@1995217 #配置文件秘钥scheduled:flag: falsework_one: 0/5 * * * * ?audit:log:filter: 'com.yzy.demo'cors: true #处理ajax 跨域请求file:type: fastdfsfastdfs:groupName: group1tomcat:request: false # 开启请求类型拦截request-method: PUT,DELETE,CONNECT,OPTIONS,PATCH,PROPFIND,PROPPATCH,MKCOL,COPY,MOVE,LOCK,UNLOCK,TRACE,HEAD   # 需要拦截的请求类型 默认拦截:PUT,DELETE,CONNECT,OPTIONS,PATCH,PROPFIND,PROPPATCH,MKCOL,COPY,MOVE,LOCK,UNLOCK,TRACE,HEADexception:switch: true  #全局异常stack: truecode: 9999info: 系统繁忙,请稍后再试!token:time: 3600
feign:hystrix:enabled: true # 开启使用熔断器httpclient:enabled: trueclient:config:default:connectTimeout: 10000 # 10s就超时readTimeout: 10000 # 10s就超时
ribbon:ReadTimeout: 2000   #请求处理的超时时间,单位为毫秒ConnectTimeout: 1000  #请求连接的超时时间,单位为毫秒MaxAutoRetries: 2  #对当前实例的重试次数MaxAutoRetriesNextServer: 1  #切换实例的重试次数,默认为1次
hystrix:command:default:execution:isolation:thread:timeoutInMilliseconds: 10000 #设置超时限制时间,单位为毫秒
fdfs:# 链接超时connect-timeout: 60# 读取时间so-timeout: 60# 生成缩略图参数thumb-image:width: 150height: 150tracker-list: 192.168.60.23:22122
#actuator端口
management:server:port: 19001#修改访问路径  2.0之前默认是/   2.0默认是 /actuator  可以通过这个属性值修改endpoints:web:base-path: /actuator#开放所有页面节点  默认只开启了health、info两个节点exposure:include: '*'#显示健康具体信息  默认不会显示详细信息endpoint:health:show-details: alwaysshutdown:enabled: true  #启用shutdown端点,以便支持优雅停机
com:blog:value: ${random.value}  #随机字符串number: ${random.int}  # 随机intbignumber: ${random.long} #随机longnumber1: ${random.int(10)} # 10以内的随机数number2: ${random.int[10,20]} #10~20 的随机数

2. demo

import sys
from ruamel.yaml import YAML
import osdef convert_yaml_to_properties_format(yaml_file, output_file):yaml = YAML()yaml.preserve_quotes = Truetry:with open(yaml_file, 'r', encoding='utf-8') as file:yaml_content = yaml.load(file)print("YAML content loaded successfully.")except Exception as e:print(f"Error reading YAML file: {e}")returndef flatten_yaml(yaml_dict, parent_key='', sep='.'):items = []for k, v in yaml_dict.items():new_key = f"{parent_key}{sep}{k}" if parent_key else kif isinstance(v, dict):items.extend(flatten_yaml(v, new_key, sep=sep))else:# 获取注释comment = Noneif hasattr(v, 'ca'):if v.ca.comment and v.ca.comment[0]:comment = v.ca.comment[0].value.strip()items.append((new_key, v, comment))return itemstry:flattened_yaml = flatten_yaml(yaml_content)with open(output_file, 'w', encoding='utf-8') as file:last_root_key = Nonefor key, value, comment in flattened_yaml:root_key = key.split('.')[0]if last_root_key and last_root_key != root_key:file.write("\n")  # 在顶层键之间添加空行last_root_key = root_keyif comment:file.write(f"{key} = {value}  # {comment}\n")else:file.write(f"{key} = {value}\n")print(f"Output written to {output_file}")except Exception as e:print(f"Error writing output file: {e}")print("Processing complete.")# 示例用法
yaml_file = 'D://test//application-master.yml'
output_file = 'D://test//output.txt'# 检查输入文件是否存在
if not os.path.exists(yaml_file):print(f"Input YAML file does not exist: {yaml_file}")
else:convert_yaml_to_properties_format(yaml_file, output_file)sys.exit(0)

3. 测试

执行 python文件
生成:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/42678.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【教程】新的Selenium!整合了隐藏浏览器指纹等功能

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 目录 前景提要 driver Driver() 常用driver 接口 最后的话 前景提要 新的selenium,整合了隐藏浏览器指纹,非常好用&#x…

算法库应用--KMP算法解决串匹配问题

学习来源 学习贺利坚老师博客 数据结构例程——串的模式匹配(KMP算法)_数据结构模式匹配例题-CSDN博客 本人引导博客 串的匹配 (KPM算法由来引导)_kpm匹配失败-CSDN博客 转载大佬sofu博客 https://www.cnblogs.com/dusf/p/kmp.html 本人详细思路引导b战…

代码随想录算法训练营第四十九天| 300.最长递增子序列 , 674. 最长连续递增序列 , 718. 最长重复子数组

300. 最长递增子序列 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int lengthOfLIS(int[] nums) {int[] dp new int[nums.length];dp[0] 1;for(int i1;i<nums.length;i){for(int j0;j<i;j){if(nums[i] > nums[j]){dp[i] Math.max(dp[j],dp[i])…

【Spring Boot】关系映射开发(三):多对多映射

《JPA 从入门到精通》系列包含以下文章&#xff1a; Java 持久层 API&#xff1a;JPA认识 JPA 的接口JPA 的查询方式基于 JPA 开发的文章管理系统&#xff08;CRUD&#xff09;关系映射开发&#xff08;一&#xff09;&#xff1a;一对一映射关系映射开发&#xff08;二&#…

香橙派AIpro做目标检测

使用香橙派AIpro做目标检测 文章目录 使用香橙派AIpro做目标检测香橙派AIpro开发板介绍香橙派AIpro应用体验快速体验香橙派的AI功能YOLOV5s目标检测使用场景描述图像目标检测视频目标检测摄像头目标检测YOLOv5s 目标检测的运行结果分析香橙派 AIpro 在运行过程中的表现 香橙派A…

git杂记

git 安装&#xff1a; 在 Windows 上安装 Git 也有几种安装方法。 官方版本可以在 Git 官方网站下载。 打开 https://git-scm.com/download/win&#xff0c;下载会自动开始。 要注意这是一个名为 Git for Windows 的项目&#xff08;也叫做 msysGit&#xff09;&#xff0c;和…

基于Java+SpringMvc+Vue技术的实验室管理系统设计与实现

博主介绍&#xff1a;硕士研究生&#xff0c;专注于信息化技术领域开发与管理&#xff0c;会使用java、标准c/c等开发语言&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架…

SUSAN

1995年英国牛津大学的S.M.Smith提出了一种新的图像边缘检测算法SUSAN算法,不同于以前经典边缘检测算法,SUSAN算法基于灰度相似性比较,采用圆形模板,对图像进行灰度差统计,无需计算方向导数,而且具备积分特性,它简单而且有效,适用于图像中边缘和角点的检测,可以去除图像…

土豆炒肉做法

菜单&#xff1a;土豆、葱、铁辣子、纯瘦肉、淀粉、生抽、酱油、刀、案板、十三香、盐巴、擦板 流程&#xff1a; 洗土豆&#xff0c;削皮&#xff0c;擦成条&#xff0c;用凉水过滤两遍淀粉&#xff0c;顺便放个燥里洗肉&#xff0c;切成条&#xff0c;按照生抽、酱油、淀粉、…

js好用的动态分页插件

js好用的动态分页插件是一款简单的分页样式插件&#xff0c;支持样式类型&#xff0c;当前页&#xff0c;每页显示数量&#xff0c;按钮数量&#xff0c;总条数&#xff0c;上一页文字&#xff0c;下一页文字&#xff0c;输入框跳转等功能。 js好用的动态分页插件

通过IDEA生成webapp及web.xml配置文件

1、选择File->Project Structure 2、选择Modules-> + -> Web 有的springboot工程选择是war工程,这个web可能已经存在了。 如果不存在,就手动创建,创建后,需要修改pom.xml中的配置 <packaging>war</packaging> 3、创建webapp根目录 这步重点就是创建…

介绍一款Java开发的商业开源MES系统

介绍一款Java开发的开源MES系统&#xff0c;万界星空科技开源的MES系统。该系统基于Java开发&#xff0c;具有广泛的适用性和高度的可定制性&#xff0c;能够满足不同行业、不同规模企业的智能制造需求。 一、系统概述 万界星空科技开源的MES系统是一款面向制造企业车间执行层…

昇思25天学习打卡营第19天 | CycleGAN图像风格迁移互换

内容介绍&#xff1a; CycleGAN(Cycle Generative Adversarial Network) 即循环对抗生成网络&#xff0c;该模型实现了一种在没有配对示例的情况下学习将图像从源域 X 转换到目标域 Y 的方法。 该模型一个重要应用领域是域迁移(Domain Adaptation)&#xff0c;可以通俗地理解…

Java中获取Class对象的三种方式

Java中获取Class对象的三种方式 1、对象调用getClass()方法2、类名.class的方式3、通过Class.forName()静态方法4、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java中&#xff0c;Class对象是一个非常重要的概念&#xff0c;它代…

JVM原理(二十):JVM虚拟机内存的三特性详解

1. 原子性、可进行、有序性 1.1. 原子性 Java内存模型围绕着在并发过程中如何处理原子性、可见性和有序性这三个特征来建立的。 Java内存模型来直接保证的原子性变量操作包括read、load、assign、use、store和write这六个。我们大致可以认为&#xff0c;基本数据类型的访问、…

科普新能源充电桩

充电桩是新能源电动车的配套基础设施&#xff0c;为电动车提供充电服务&#xff0c;与我们的生活也是息息相关&#xff0c;本篇文章来科普一下充电桩基础知识。 充电桩的分类 按照供电方式分类 交流充电桩&#xff1a;特点是小电流、桩体较小、安装灵活&#xff1b;直流充电…

【TB作品】51单片机 Proteus仿真 超声波LCD1602ADC0832 身高体重测量仪

00024 超声波LCD1602ADC0832 实验报告&#xff1a;基于51单片机的身高体重测量仪设计 背景介绍 本实验设计并实现了一个基于51单片机的身高体重测量仪。该系统利用超声波传感器测量高度&#xff0c;通过ADC0832模数转换芯片获取重量数据&#xff0c;并使用LCD1602显示屏显示…

Alt与Tab切换窗口时将Edge多个标签页作为一个整体参与切换的方法

本文介绍在Windows电脑中&#xff0c;使用Alt与Tab切换窗口时&#xff0c;将Edge浏览器作为一个整体参与切换&#xff0c;而不是其中若干个页面参与切换的方法。 最近&#xff0c;需要将主要使用的浏览器由原本的Chrome换为Edge&#xff1b;但是&#xff0c;在更换后发现&#…

桌面快充插线板+伸缩数据线,轻松实现1+1>2

手机、平板、笔记本等电子设备已成为我们日常工作和学习的必备工具。然而,随着设备数量的增加,充电问题也日益凸显。桌面空间有限,多个快充头不仅显得杂乱无章,而且效率低下,无法满足我们高效办公的需求。 在这样的背景下,倍思Nomos氮化镓100W桌面充电站凭借其创新的设计和强大…