本文目录导读:

我来介绍几种生成YAML配置的Python方法:
使用 PyYAML 库(推荐)
安装
pip install pyyaml
基本示例
import yaml
# 创建Python字典
config = {
'server': {
'host': 'localhost',
'port': 8080,
'ssl': True
},
'database': {
'host': 'db.example.com',
'port': 5432,
'name': 'myapp',
'user': 'admin',
'password': 'secret123'
},
'logging': {
'level': 'INFO',
'file': '/var/log/app.log',
'format': '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
},
'features': ['user_auth', 'data_export', 'notifications']
}
# 生成YAML字符串
yaml_str = yaml.dump(config, default_flow_style=False)
print(yaml_str)
# 导出到文件
with open('config.yaml', 'w', encoding='utf-8') as f:
yaml.dump(config, f, default_flow_style=False, allow_unicode=True)
高级用法
保存到文件并格式化
import yaml
from pathlib import Path
class ConfigGenerator:
def __init__(self):
self.config = {}
def add_section(self, name, data):
"""添加配置节"""
self.config[name] = data
def add_server_config(self, host='localhost', port=8080, ssl=True):
self.config['server'] = {
'host': host,
'port': port,
'ssl': ssl
}
def add_database_config(self, **kwargs):
default_db = {
'host': 'localhost',
'port': 5432,
'name': 'app_db',
'user': 'app_user',
'password': 'change_me'
}
default_db.update(kwargs)
self.config['database'] = default_db
def add_logging_config(self, level='INFO', file_path='app.log'):
self.config['logging'] = {
'level': level,
'file': file_path,
'format': '%(asctime)s - %(levelname)s - %(message)s'
}
def generate(self, output_file='config.yaml'):
"""生成YAML文件"""
with open(output_file, 'w', encoding='utf-8') as f:
yaml.dump(self.config, f,
default_flow_style=False,
sort_keys=False,
indent=2,
allow_unicode=True)
print(f"配置文件已生成: {output_file}")
return output_file
# 使用示例
generator = ConfigGenerator()
generator.add_server_config(host='0.0.0.0', port=3000)
generator.add_database_config(host='mysql.example.com', password='secure_password')
generator.add_logging_config(level='DEBUG')
generator.generate('app_config.yaml')
复杂配置示例
import yaml
from datetime import datetime
def generate_complex_config():
config = {
'application': {
'name': 'MyApp',
'version': '1.0.0',
'description': 'A sample application configuration',
'created': datetime.now().isoformat()
},
'services': [
{
'name': 'auth-service',
'url': 'http://auth:5000',
'endpoints': ['/login', '/logout', '/verify'],
'timeout': 30,
'retry': {'max_attempts': 3, 'backoff': 'exponential'}
},
{
'name': 'data-service',
'url': 'http://data:5001',
'endpoints': ['/query', '/update'],
'timeout': 60
}
],
'cache': {
'type': 'redis',
'host': 'redis-server',
'port': 6379,
'ttl': 3600,
'max_connections': 10
},
'environment': {
'production': False,
'debug': True,
'allowed_hosts': ['*']
}
}
# 自定义YAML表示器
class CustomDumper(yaml.Dumper):
pass
def str_representer(dumper, data):
if '\n' in data:
return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='|')
return dumper.represent_scalar('tag:yaml.org,2002:str', data)
CustomDumper.add_representer(str, str_representer)
# 生成YAML
with open('complex_config.yaml', 'w', encoding='utf-8') as f:
yaml.dump(config, f,
Dumper=CustomDumper,
default_flow_style=False,
sort_keys=False,
indent=4,
allow_unicode=True)
# 调用生成
generate_complex_config()
从模板生成配置
import yaml
import json
def generate_from_template(template_file, data_source):
"""
从JSON模板生成YAML配置
"""
# 读取或生成模板配置
template = {
'app_name': '${APP_NAME}',
'version': '${VERSION}',
'database': {
'host': '${DB_HOST}',
'port': '${DB_PORT}',
'name': '${DB_NAME}'
}
}
# 实际数据
values = {
'APP_NAME': 'Production App',
'VERSION': '2.0.0',
'DB_HOST': 'prod-db.example.com',
'DB_PORT': 5432,
'DB_NAME': 'production_db'
}
# 替换模板变量
def replace_values(obj, values):
if isinstance(obj, str):
for key, value in values.items():
obj = obj.replace(f'${{{key}}}', str(value))
return obj
elif isinstance(obj, dict):
return {k: replace_values(v, values) for k, v in obj.items()}
elif isinstance(obj, list):
return [replace_values(item, values) for item in obj]
return obj
config = replace_values(template, values)
# 导出为YAML
with open('generated_config.yaml', 'w') as f:
yaml.dump(config, f, default_flow_style=False)
print("配置生成完成!")
return config
# 使用
result = generate_from_template(None, None)
print(yaml.dump(result, default_flow_style=False))
实用函数工具
import yaml
from typing import Any, Dict, Optional
def dict_to_yaml(data: Dict[str, Any],
output_file: Optional[str] = None,
**kwargs) -> str:
"""
将字典转换为YAML格式
参数:
data: Python字典
output_file: 输出文件路径(可选)
**kwargs: 其他yaml.dump参数
返回:
YAML格式字符串
"""
# 默认参数
yaml_params = {
'default_flow_style': False,
'sort_keys': False,
'allow_unicode': True,
'indent': 2
}
yaml_params.update(kwargs)
yaml_str = yaml.dump(data, **yaml_params)
if output_file:
with open(output_file, 'w', encoding='utf-8') as f:
f.write(yaml_str)
return yaml_str
def validate_yaml(yaml_content: str) -> bool:
"""
验证YAML格式是否正确
"""
try:
yaml.safe_load(yaml_content)
return True
except yaml.YAMLError as e:
print(f"YAML格式错误: {e}")
return False
def merge_configs(base_config: Dict, override_config: Dict) -> Dict:
"""
合并两个配置字典
"""
merged = base_config.copy()
for key, value in override_config.items():
if key in merged and isinstance(merged[key], dict) and isinstance(value, dict):
merged[key] = merge_configs(merged[key], value)
else:
merged[key] = value
return merged
# 快速使用示例
config_data = {
'api': {
'endpoint': 'https://api.example.com',
'version': 'v2',
'timeout': 30
}
}
# 直接生成
yaml_str = dict_to_yaml(config_data)
print(yaml_str)
# 保存到文件
dict_to_yaml(config_data, 'api_config.yaml')
- PyYAML 是生成YAML最常用的库
- 使用
yaml.dump()可以轻松将Python对象转为YAML - 可以自定义格式选项(缩进、排序等)
- 支持复杂数据结构(嵌套字典、列表等)
- 可以结合模板系统动态生成配置
记得安装依赖:pip install pyyaml
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播