从YAML向Python脚本传变量遇列表索引错误,求解决方案
解决YAML嵌套字典列表遍历的Python报错问题
首先咱们把问题拆解开:你遇到的list indices must be integers or slices, not str错误,核心是循环写法逻辑错误,再加上yaml加载的安全小问题,咱们一步步来解决。
修正后的完整代码(两种常见场景)
场景1:分别打印地址列表和掩码列表
如果你只是想单独遍历输出address和mask里的每一项,可以用这个写法:
#!/usr/bin/env python3 import yaml import sys def main(): # 用safe_load替代load,避免潜在的代码注入风险 with open(sys.argv[1], 'r') as f: inventory = yaml.safe_load(f) # 遍历address列表 print("📋 源地址列表:") for addr in inventory['source']['address']: print(f" - {addr}") # 遍历mask列表 print("\n🔒 子网掩码列表:") for mask in inventory['source']['mask']: print(f" - {mask}") if __name__ == "__main__": main()
场景2:配对打印地址和对应的掩码
因为你的address和mask列表长度一致,大概率是要把每个地址和对应的掩码配对输出,这时候用zip()函数最合适:
#!/usr/bin/env python3 import yaml import sys def main(): with open(sys.argv[1], 'r') as f: inventory = yaml.safe_load(f) # 先取出两个列表 addresses = inventory['source']['address'] masks = inventory['source']['mask'] # 配对遍历 print("🔗 地址-掩码配对:") for addr, mask in zip(addresses, masks): print(f" - 地址:{addr},掩码:{mask}") if __name__ == "__main__": main()
原代码报错的原因解析
咱们来扒一扒你原代码里的问题:
循环写法逻辑完全错误:
你写的for i,j in ['source']['address'],['source']['mask']完全不符合Python语法逻辑:['source']是一个只包含字符串"source"的列表,你试图用['address'](又是一个列表)去索引它——但列表只能用整数或者切片来索引,这就直接触发了你看到的错误。yaml加载的安全隐患:
旧版的yaml.load()存在代码注入风险,官方现在强烈推荐用yaml.safe_load()来加载不可信的YAML文件,这个好习惯得养成。
运行方式
把上述代码保存为parse_yaml.py,然后在终端运行:
python3 parse_yaml.py 你的yaml文件名.yaml
内容的提问来源于stack exchange,提问作者Federi
相关产品推荐
相关产品推荐

