问题场景描述
最近在处理一个基于YAML格式的区域权限配置文件时,遇到了一个自动化处理需求。配置文件结构如下:
coolregion:
min: {z: -99613.0, y: 45.0, x: -99805.0}
flags: {vehicle-place: allow}
max: {z: 100387.0, y: 127.0, x: 100195.0}
priority: 0
type: cuboid
owners:
groups: [jacob, eithan, michael]
members:
groups: [jack, noah]
niceregion:
min: {z: 544.0, y: 6.0, x: 184.0}
flags: {}
max: {z: 556.0, y: 13.0, x: 197.0}
priority: 0
type: cuboid
owners:
groups: [noah]
members:
groups: [logan, lucas, jack]
解决方案设计
我们需要编写一个Python脚本,能够解析这个YAML文件,并为每个成员生成对应的区域归属文件。这里给出完整的实现方案:
import yaml
from collections import defaultdict
def process_region_file(input_file):
with open(input_file, 'r') as f:
data = yaml.safe_load(f)
member_regions = defaultdict(list)
for region_name, region_data in data.items():
# 处理owners中的成员
if 'owners' in region_data and 'groups' in region_data['owners']:
for member in region_data['owners']['groups']:
member_regions[member].append(region_name)
# 处理members中的成员
if 'members' in region_data and 'groups' in region_data['members']:
for member in region_data['members']['groups']:
member_regions[member].append(region_name)
# 为每个成员生成文件
for member, regions in member_regions.items():
filename = f"{member}.txt"
with open(filename, 'w') as f:
f.write(",".join(regions))
print("文件生成完成!")
# 使用示例
process_region_file("regions.yml")
实现细节说明
这个脚本主要做了以下几件事:
- 使用PyYAML库解析YAML格式文件
- 使用defaultdict自动初始化成员列表
- 同时处理owners和members两个节点下的成员
- 生成的文本文件使用逗号分隔区域名称
进阶优化建议
如果需要处理更复杂的场景,可以考虑以下优化:
# 去重处理
regions = list(set(regions)) # 在写入文件前添加这行
# 按字母顺序排序
regions.sort()
# 添加区域类型标识
for region_name, region_data in data.items():
region_type = region_data.get('type', 'unknown')
full_region_id = f"{region_name}({region_type})"
member_regions[member].append(full_region_id)
实际应用案例
假设我们有以下输入文件:
# regions.yml
region1:
owners:
groups: [张三, 李四]
members:
groups: [王五]
region2:
owners:
groups: [李四]
type: sphere
运行脚本后将生成:
- 张三.txt 内容: region1
- 李四.txt 内容: region1,region2
- 王五.txt 内容: region1