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

Python读取文本文件时如何正确解析跨多行的变量值

Python读取跨多行等号分隔配置文件的实现方案

核心逻辑是放弃逐行拆分等号的处理方式,改为遍历全文件时维护当前读取状态,识别新变量起始标记(行内包含等号),将两个相邻等号行之间的所有内容都归为前一个变量的值。

实现步骤

  • 初始化状态变量:用字典存储最终解析的键值对,用临时变量记录当前正在处理的变量名、累计的变量值内容
  • 逐行遍历文件:
    • 若当前行包含=,判定为新变量起始行:先将上一个累计完成的变量存入字典,再按第一个=拆分当前行,左侧为新变量名,右侧为新变量的初始值
    • 若当前行不包含=,判定为上一个变量的值续行,将当前行内容追加到当前变量的累计值中
  • 遍历结束后补充存储最后一个变量,避免文件末尾的多行值丢失

可直接运行的代码示例

def parse_kv_config(file_path, keep_linebreak=False):
    """
    解析等号分隔的配置文件,支持多行值
    :param file_path: 配置文件路径
    :param keep_linebreak: 值是否保留原换行格式,默认False用空格拼接多行内容
    """
    config = {}
    current_key = None
    current_val_parts = []
    split_sep = '\n' if keep_linebreak else ' '

    with open(file_path, 'r', encoding='utf-8') as f:
        for line in f:
            # 移除行尾换行符,保留行内原始空格
            line_content = line.rstrip('\n')
            # 跳过纯空行
            if not line_content.strip():
                continue
            
            if '=' in line_content:
                # 遇到新变量,先存储上一个已解析完成的变量
                if current_key is not None:
                    config[current_key] = split_sep.join(current_val_parts).strip()
                # 按第一个等号拆分,避免值本身包含等号时解析错误
                key, val_start = line_content.split('=', 1)
                current_key = key.strip()
                current_val_parts = [val_start.strip()]
            else:
                # 多行值续行,追加内容
                current_val_parts.append(line_content.strip())
    
    # 存储文件最后一个变量
    if current_key is not None:
        config[current_key] = split_sep.join(current_val_parts).strip()
    
    return config

使用说明

  • 针对给出的Corr_Mat示例,调用上述函数后,config['Corr_Mat']会得到完整值10 0 0 20 10 0 0 20 10;如果传入keep_linebreak=True,会保留原有的三行换行格式
  • 如果需要将矩阵类的值转为数值结构,可以在解析完成后做二次处理:
# 把空格分隔的数值字符串转为二维矩阵
raw_val = config['Corr_Mat']
num_list = list(map(float, raw_val.split()))
# 按每行3个元素还原3*3矩阵
corr_matrix = [num_list[i:i+3] for i in range(0, len(num_list), 3)]

注意事项

  • 拆分键值时必须用split('=', 1)限制只拆分一次,防止变量值中包含=时出现解析错误
  • 如果配置文件存在#开头的注释行,可以在空行判断的位置增加逻辑,跳过以#开头的行即可
  • 如果值中存在被引号包裹且内部包含=的场景,可以额外增加判断逻辑,仅当=不在引号范围内时才判定为新变量行,简单业务场景直接判断'=' in line即可满足需求

内容的提问来源于stack exchange,提问作者user273331

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 00:24:43