将多行格式参数文件转Python字典并修改指定参数的实现
Oracle网络配置文件的多行参数修改方案
用户的配置文件示例:
NAMES.DIRECTORY_PATH=(example1,example2) SQLNET.ALLOWED_LOGON_VERSION_SERVER=example SQLNET.ALLOWED_LOGON_VERSION_CLIENT=example SQLNET.INBOUND_CONNECT_TIMEOUT=example SQLNET.EXPIRE_TIME=example SSL_CLIENT_AUTHENTICATION=example SSL_VERSION=example SQLNET.AUTHENTICATION_SERVICES=(example1) SSL_CLIENT_AUTHENTICATION=example WALLET_LOCATION= (SOURCE= (METHOD=FILE) (METHOD_DATA= (DIRECTORY=somedir)
需求是将该配置文件加载到Python环境,修改指定键的参数值,保留其余参数后重新保存。但现有代码无法处理WALLET_LOCATION这类多行结构的参数——它会把每一行都当成独立键值对,导致多行参数被拆成无效条目。
现有代码如下:
# 打开文件以移除参数、值中的空格 with open('tempfile', 'r') as f: lines = f.readlines() # 移除空格 lines = [line.replace(' ', '') for line in lines] # 最终将行写入文件 with open('tempfile', 'w') as f: f.writelines(lines) # 找到目标键并修改其值 d = {} with open('tempfile') as f: d = dict(x.rstrip().split('=', 1) for x in f) print("修改前的字典",d) d['SQLNET.AUTHENTICATION_SERVICES'] = '(somevalue)' print("修改后的字典-", d)
解决方案:解析并处理多行参数
核心思路是逐行读取文件,判断当前行是否为键值对起始行(包含=),若是则记录键,后续的括号行作为该键值的一部分,直到遇到下一个键或文件结束。
实现代码:
def parse_config(file_path): config = {} current_key = None current_value = [] with open(file_path, 'r') as f: for line in f: line = line.strip() # 跳过空行 if not line: continue # 判断是否是键值对起始行 if '=' in line: # 保存上一个未完成的键值 if current_key is not None: config[current_key] = '\n'.join(current_value) # 拆分键和初始值 key, value = line.split('=', 1) current_key = key.strip() # 处理初始值 if value.strip(): current_value = [value.strip()] else: current_value = [] else: # 属于当前键的多行内容 if current_key is not None: current_value.append(line) # 处理最后一个键值 if current_key is not None: config[current_key] = '\n'.join(current_value) return config def save_config(config, file_path): with open(file_path, 'w') as f: for key, value in config.items(): f.write(f"{key}=") if value: # 多行值换行写入 if '\n' in value: f.write(f"\n{value}\n") else: f.write(f"{value}\n") else: f.write("\n") # 使用示例 config = parse_config('tempfile') print("修改前的配置:", config) # 修改指定键的值 config['SQLNET.AUTHENTICATION_SERVICES'] = '(somevalue)' # 也可以修改多行参数 config['WALLET_LOCATION'] = """(SOURCE= (METHOD=FILE) (METHOD_DATA= (DIRECTORY=newdir)""" print("修改后的配置:", config) # 保存修改后的配置 save_config(config, 'tempfile_modified')
代码说明
parse_config:逐行解析配置文件,将单行、多行参数统一存入字典,多行参数的值为包含换行符的字符串。save_config:将修改后的字典写回文件,完整保留原有的多行格式。- 可直接修改字典中任意键的值,包括多行结构的参数,保存后格式与原文件一致。
内容的提问来源于stack exchange,提问作者tonytx
相关产品推荐
相关产品推荐

