You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 12:03:25