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
相关产品推荐
相关产品推荐

