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

将多行格式参数文件转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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 21:50:36