Python读取同位素数据文件生成指定嵌套字典实现求助
核素属性文件转嵌套字典实现方案
原代码存在的核心问题
- 未按核素聚合数据:单条核素数据占7行,原代码逐行处理、逐行新建子字典,导致单条核素的字段被拆分到多次循环中,最终数据被反复覆盖
- 字段解析逻辑缺失:没有按行内的
=分割字段名和值,也未做数据类型转换、特殊值清洗 - 字典赋值逻辑错误:主字典始终为空,子字典每次循环重置,最终仅保留最后一次循环生成的无效空值结构
实现步骤
- 读取文件时提前过滤空行,避免空行打乱数据分组规则
- 按每7行一个切片聚合为单个核素的完整数据块
- 逐行解析数据块内容,按
=分割字段名与字段值,提取需要的原子序数、元素符号、质量数、相对原子质量四个核心信息 - 清洗相对原子质量字段:截断括号包裹的测量不确定度部分,将数值转为浮点数
- 拼接
元素符号+质量数作为主字典的键,将组装好的含Z/A/m字段的子字典存入主字典
完整实现代码
filename = 'file1.txt' isotopes = {} # 上下文管理器自动处理文件关闭,读取所有非空行 with open(filename, 'r', encoding='utf-8') as f: valid_lines = [line.strip() for line in f if line.strip()] # 按7行步长遍历,分组处理每个核素 for block_start in range(0, len(valid_lines), 7): current_nuclide_lines = valid_lines[block_start:block_start+7] sub_dict = {} element_symbol = "" mass_number = 0 for line in current_nuclide_lines: # 按第一个等号分割,避免值内容含等号时分割异常 field_name, field_value = [seg.strip() for seg in line.split('=', 1)] if field_name == "Atomic Number": sub_dict['Z'] = int(field_value) elif field_name == "Atomic Symbol": element_symbol = field_value elif field_name == "Mass Number": mass_number = int(field_value) sub_dict['A'] = mass_number elif field_name == "Relative Atomic Mass": # 去掉括号里的不确定度,转浮点数 pure_mass = field_value.split('(')[0] sub_dict['m'] = float(pure_mass) # 组装主字典键值对 isotopes[f"{element_symbol}{mass_number}"] = sub_dict # 可按需打印验证结果 # print(isotopes['H1']) # print(isotopes['U235'])
注意事项
- 如果文件中核素条目之间的空行数量不固定,可改为状态机模式逐行累计字段,攒齐Z、符号、A、m四个字段就生成一条核素记录,重置临时变量后继续读取下一条,避免固定7行切片的适配问题
- 若存在同核异能素(Notes字段为m的条目),可按需在键名后加m做区分,避免键名重复覆盖
- 处理数值类型时做好异常捕获,避免个别格式异常的行导致整个脚本中断
内容的提问来源于stack exchange,提问作者submariner2
相关产品推荐
相关产品推荐

