
本文介绍一种安全、简洁的方法,将格式不统一(分隔符可能是 `;`、`:` 或空格)的字符串解析为键值对,并存入字典,避免使用 `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 代码的重要习惯。










