如何将特定结构化文本文件转换为指定格式的Python字典?
回答
嘿,你的思路方向是对的,但咱们可以从资源安全、健壮性、可读性这几个维度优化代码,下面给你几个更优的方案:
方案1:正则表达式匹配(最通用健壮)
如果你的文本格式可能存在空格、换行等小变化,正则表达式能精准匹配每个item块里的id和name,不管它们的排版方式:
import re def label_map_to_dict(path): # 正则匹配item块,提取id数字和name字符串 item_pattern = r'item\s*\{\s*id:\s*(\d+)\s*name:\s*\'([^\']+)\'\s*\}' result_dict = {} # 用with语句自动管理文件,避免资源泄漏 with open(path, 'r', encoding='utf-8') as file: content = file.read() # 一次性匹配所有符合规则的item matches = re.findall(item_pattern, content) for id_str, name in matches: result_dict[name] = int(id_str) return result_dict
优势:能处理单行/多行的item格式,不用担心id和name的行顺序问题,代码简洁且容错性强。
方案2:优化原代码的配对逻辑与资源管理
如果不想用正则,也可以改进你的原代码,确保每个name都和对应的id配对,同时修复文件资源管理的问题:
def label_map_to_dict(path): result_dict = {} current_id = None with open(path, 'r', encoding='utf-8') as file: for line in file: line = line.strip() if not line: continue if 'id:' in line: # 提取当前item的id current_id = int(line.split(':')[1].strip()) elif 'name:' in line: # 提取name后,立即和最近的id配对 name = line.split("'")[1] if current_id is not None: result_dict[name] = current_id current_id = None # 重置,准备处理下一个item return result_dict
优势:逻辑和你的原代码接近,容易理解,同时避免了zip可能因id/name数量不匹配导致的错误。
方案3:生成器处理大文件(内存友好)
如果你的文本文件非常大,一次性读入内存会占用过多资源,可以用生成器逐行处理:
import re def parse_item_generator(path): item_pattern = r'item\s*\{\s*id:\s*(\d+)\s*name:\s*\'([^\']+)\'\s*\}' with open(path, 'r', encoding='utf-8') as file: for line in file: # 逐行匹配item,找到就yield出来 matches = re.findall(item_pattern, line) for id_str, name in matches: yield (name, int(id_str)) def label_map_to_dict(path): # 直接把生成器的结果转成字典 return dict(parse_item_generator(path))
优势:每次只处理一行数据,内存占用极低,适合GB级别的大文件场景。
总结
如果你的文本格式严格固定,优化后的原代码足够用;但如果格式可能有变化(比如空格、换行),正则方案是最优选择,通用性和健壮性都更强。
内容的提问来源于stack exchange,提问作者MJA
相关产品推荐
相关产品推荐

