遍历含列表的文件时映射返回None,但手动测试正常的问题排查
问题分析与解决
问题根源
你写入output.txt的内容是字符串形式的Python列表(比如['eight', 'one', 'two', 'eight', '7']是一行文本,不是可直接操作的列表对象)。当你用line.split()拆分时,得到的元素会包含引号、逗号、方括号这些符号,比如第一个元素是"['eight',",而不是'eight',这些带符号的字符串自然不在你的mapping字典里,所以全部返回None。
解决方案
使用ast.literal_eval()将每行的字符串解析为真正的Python列表,之后再进行映射操作。修改后的代码如下:
import ast # 定义映射字典(与测试代码一致) mapping = { 'zero': 0, 'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5, 'six': 6, 'seven': 7, 'eight': 8, 'nine': 9, '0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9 } output_filename = 'output.txt' processed_filename = 'processed.txt' with open(output_filename, 'r') as infile, open(processed_filename, 'w') as outfile: for line in infile: # 去除行尾换行符,解析字符串为Python列表 items = ast.literal_eval(line.strip()) mapped_items = [] for item in items: # 用get方法简化逻辑,找不到对应值时返回None mapped_items.append(mapping.get(item, None)) outfile.write(f"{mapped_items}\n")
关键说明
ast.literal_eval()可以安全地将字符串形式的Python字面量(列表、字典等)转换为对应对象,避免了eval()的安全风险。- 运行后
processed.txt的第一行会得到预期的[8, 1, 2, 8, 7],其余行也会按映射规则生成正确结果。
内容的提问来源于stack exchange,提问作者justFF
相关产品推荐
相关产品推荐

