YAML区域配置文件中按成员名自动生成归属区域文件的Python脚本实现


阅读 8 次

问题场景描述

最近在处理一个基于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