为何animal、vegetable、mineral变量始终为空?求Python代码解决方案
问题根源分析
你当前的代码错误在于直接把文件的文本行当成了列表元素处理,而没有解析AVM.py里定义的data列表变量:
- 当你用
enumerate(toBeSplit)迭代文件对象时,每一个itemB是文件里的一行字符串,比如第二行是["76534ytuieghfyo7g8t", "Animal", "Cheetah"], - 你用
itemB[1]取的是字符串的第二个字符(这里是空格),永远不可能等于"Vegetable",所以所有if判断都不触发,变量自然为空。
解决方法
要正确获取AVM.py里的data数据,有两种常用方式:
方式1:直接导入模块(推荐)
因为AVM.py是合法的Python文件,可以直接导入其中的data变量:
# splitter.py from AVM import data animals = [] vegetables = [] minerals = [] for item in data: category = item[1] if category == "Animal": animals.append(item) elif category == "Vegetable": vegetables.append(item) elif category == "Mineral": minerals.append(item) # 后续可将三个列表写入不同文件
方式2:用ast模块解析文件文本
如果不想用导入的方式,可以用Python的ast模块解析文件内容,提取data变量的值:
# splitter.py import ast animals = [] vegetables = [] minerals = [] with open('AVM.py', 'r', encoding='utf-8') as f: content = f.read() tree = ast.parse(content) # 遍历语法树找到data变量 for node in ast.walk(tree): if isinstance(node, ast.Assign) and node.targets[0].id == 'data': data = ast.literal_eval(node.value) break # 拆分数据 for item in data: category = item[1] if category == "Animal": animals.append(item) elif category == "Vegetable": vegetables.append(item) elif category == "Mineral": minerals.append(item)
额外说明
两种方式都能正确获取data列表,然后通过遍历每个元素的第二个值(item[1])判断分类,将元素分配到对应列表中。导入模块的方式更简洁高效,适合绝大多数场景。
内容的提问来源于stack exchange,提问作者WillTheConker
相关产品推荐
相关产品推荐

