如何用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
相关产品推荐
相关产品推荐

