You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python从含zone块的文件生成指定结构字典?

解析zone块生成目标字典的Python方案

我明白你的需求了:从以zone开头的分块文件中,提取每个块的test_*标识作为字典的键,块内首行之后的所有行作为对应的值,最终生成符合要求的字典。下面给你一个实用的Python实现方案,还考虑到了重复键的处理。

实现思路

  • 分割文件块:利用块之间的空行作为分隔符,把整个文件拆分成独立的zone块,同时过滤掉无效的空块。
  • 提取键与值:对每个块,先从首行中提取test_*作为键;再收集块内首行之后的所有非空行作为对应的值。
  • 处理重复键:如果同一个test_*出现多次,默认把对应的值合并到同一个列表里(如果需要覆盖旧值,可以简单修改逻辑)。

完整代码

def parse_zone_file(file_path):
    zone_dict = {}
    # 读取文件并按空行分割块,过滤掉空内容的块
    with open(file_path, 'r', encoding='utf-8') as f:
        content = f.read()
        # 分割块,同时去除块前后的空白字符
        blocks = [block.strip() for block in content.split('\n\n') if block.strip()]
    
    for block in blocks:
        # 把块拆分成行,过滤掉空行
        lines = [line.strip() for line in block.split('\n') if line.strip()]
        if not lines:
            continue
        
        # 从首行提取test_*键:首行格式是"zone name test_x vsan ...",取第3个元素
        first_line = lines[0]
        key = first_line.split()[2]
        
        # 收集首行之后的所有行作为值
        values = lines[1:]
        
        # 处理重复键:追加值而非覆盖
        if key in zone_dict:
            zone_dict[key].extend(values)
        else:
            zone_dict[key] = values
    
    return zone_dict

# 使用示例:替换成你的文件路径
if __name__ == "__main__":
    result = parse_zone_file("zone_file.txt")
    # 打印结果验证
    for key, value in result.items():
        print(f"★ 键: {key}")
        print("值:")
        for line in value:
            print(f"  - {line}")
        print("-" * 30)

针对你提供的示例内容测试

假设你的文件内容整理成正确的换行格式(每个记录单独一行,块间有空行):

zone name test_1 vsan xx

  • fcid 0x170024 [pwwn 10:00:00:00:c9:5f:84:93] [xxx]
  • fcid 0x170016 [pwwn 50:06:0e:80:16:60:ef:43] [xxxxxx]

zone name test_2 vsan xx

  • fcid 0x170024 [pwwn 10:00:00:00:c9:5f:84:93] [xx]
  • fcid 0x170017 [pwwn 50:06:0e:80:16:60:ef:63] [xxx]

zone name test_2 vsan yy
pwwn 10:00:00:90:fa:81:bb:f2

  • fcid 0x0b00c0 [pwwn 50:06:0e:80:07:e6:2e:26]

运行代码后得到的字典结果如下:

{
    'test_1': [
        '* fcid 0x170024 [pwwn 10:00:00:00:c9:5f:84:93] [xxx]',
        '* fcid 0x170016 [pwwn 50:06:0e:80:16:60:ef:43] [xxxxxx]'
    ],
    'test_2': [
        '* fcid 0x170024 [pwwn 10:00:00:00:c9:5f:84:93] [xx]',
        '* fcid 0x170017 [pwwn 50:06:0e:80:16:60:ef:63] [xxx]',
        'pwwn 10:00:00:90:fa:81:bb:f2',
        '* fcid 0x0b00c0 [pwwn 50:06:0e:80:07:e6:2e:26]'
    ]
}

自定义调整说明

  • 如果zone首行的格式有变化(比如test_*的位置不是第3个元素),可以修改first_line.split()[2]的索引值来适配。
  • 如果不需要合并重复键的值,而是要覆盖旧值,把zone_dict[key].extend(values)改成zone_dict[key] = values即可。

内容的提问来源于stack exchange,提问作者ZDZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:07:30