如何在 Python 中从字符串安全解析键值对并存储为字典

13次阅读

如何在 Python 中从字符串安全解析键值对并存储为字典

本文介绍一种安全、简洁的方法,将格式不统一(分隔符可能是 `;`、`:` 或空格)的字符串解析键值对,并存入字典,避免使用 `exec`、`globals()` 或 `locals()` 动态创建变量带来的安全隐患与维护难题。

在实际数据处理中,我们常遇到结构松散的字符串,例如:

string = 'var_name; var_value var_name1; var_value1 var_name2 var_value2 var_name3: var_value3'

其中键(变量名)与值之间可能用分号 ;、冒号 : 分隔,也可能仅靠空格分隔——这种不规则性使得直接用 split(‘;’) 或正则硬匹配容易出错。

推荐做法是放弃动态创建变量(如 exec(f”{key} = {value}”)),因为这会污染命名空间、引发作用域混乱、难以调试,且存在代码注入风险。取而代之的是使用标准、可迭代、易调试的 dict 结构。

以下是一个健壮的解析方案:

立即学习Python免费学习笔记(深入)”;

def parse_key_value_string(s):     Tokens = s.split()     if len(tokens) % 2 != 0:         raise ValueError("Invalid string format: unmatched key-value pairs")      result = {}     for i in range(0, len(tokens), 2):         key = tokens[i].rstrip(";:")         value = tokens[i + 1]         result[key] = value     return result  # 示例使用 string = "var_name; var_value var_name1; var_value1 var_name2 var_value2 var_name3: var_value3" data = parse_key_value_string(string) print(data) # 输出: {'var_name': 'var_value', 'var_name1': 'var_value1', 'var_name2': 'var_value2', 'var_name3': 'var_value3'}

该函数的核心逻辑清晰:

  • 先按空白字符切分为 tokens,确保键值成对出现;
  • 遍历偶数索引位置,将每个 token[i] 去除末尾的 ; 或 : 作为键;
  • 对应的 token[i+1] 直接作为值;
  • 显式校验奇数长度输入,提前报错提升鲁棒性。

优势总结

  • 安全:不执行任意代码,无 eval/exec 风险;
  • 可读:逻辑线性,易于理解与单元测试;
  • 灵活:支持混合分隔符,后续可轻松扩展(如支持引号包裹的含空格值);
  • 可扩展:返回字典后,可无缝对接 json.dumps()、pandas.DataFrame([data]) 或配置管理等场景。

⚠️ 注意事项

  • 当前实现假设所有值本身不含空格;若值可能含空格(如 ‘name: “John Doe”‘),需改用正则或 shlex 解析;
  • 键名若重复,后出现的值将覆盖前者(python 字典行为);如有去重或报错需求,可在赋值前加入 if key in result: raise KeyError(…) 检查。

坚持“用字典代替动态变量”,是写出可维护、可测试、可协作的 Python 代码的重要习惯。

text=ZqhQzanResources