Python处理MapReduce输出文件:如何将列表格式字符串转换为原生嵌套列表
把清洗后的字符串转成目标嵌套列表的方法
适配你现有代码的改法
你现在洗完行之后得到的clean_line是没有外层括号的拼接字符串,类似[0, 21], [1, 4], [2, 5],要转成真正的列表类型根本不用手动拆分,用Python标准库的ast.literal_eval就能安全解析,比直接用eval靠谱,不会执行字符串里的恶意代码。
操作很简单:
- 先导入自带的
ast模块,不用装第三方包 - 给
clean_line前后补上方括号,拼成完整的Python列表格式字符串 - 用
ast.literal_eval把字符串解析成实际的列表对象,直接往corpus里加就行
对应修改的代码:
import re import ast corpus = [] FILENAME = "你的文件路径" with open(FILENAME) as f: content = f.readlines() for line in content: # 原来的清洗逻辑完全不用动 clean_line = re.sub(r'^.*?\[\[', '[', line) clean_line = re.sub('[\n]', '', clean_line)[:-2] # 新增的解析部分 full_list_str = f"[{clean_line}]" parsed_item = ast.literal_eval(full_list_str) corpus.append(parsed_item)
跑完之后corpus里的每个元素都是实打实的嵌套列表类型,整个corpus就是你要的最终总列表结构,没有字符串残留。
更不容易踩坑的优化写法
你现在用正则匹配删字符的逻辑其实挺脆的,万一后面列表里出现连续的]、或者嵌套层级变了,很容易截错内容。其实可以直接靠原始文件的结构取值,根本不用硬猜字符边界:
import ast corpus = [] FILENAME = "你的文件路径" with open(FILENAME) as f: for line in f: # 按Tab把每行的key和value拆开 _, value_str = line.strip().split('\t', 1) # 把value的字符串直接解析成真实的列表 value_obj = ast.literal_eval(value_str) # value本身是[序号, 目标嵌套列表]的二元结构,直接取第二个元素就是要的内容 corpus.append(value_obj[1])
这种写法只要原始MapReduce输出的key-value格式不变,不管里面的列表内容怎么变,都能准确取到值,不会因为字符匹配出问题。
内容的提问来源于stack exchange,提问作者huy
相关产品推荐
相关产品推荐

