文章目录
- 前言
- ## 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文件
生成: