如何存储含数字与字符串的Python字典并保留类型敏感性
解决Python字典保留键类型敏感性的存储方案
首先得说,JSON确实踩了这个坑——它会把所有非字符串的键自动转成字符串,读回来的时候根本没法区分原来的整数键和字符串键,比如{1: "a", "1": "b"}存成JSON再读,直接就只剩一个键了,完全不符合需求。下面给你几个无需额外复杂操作的实用方案:
1. 使用pickle(原生支持类型全保留,但可读性有限)
pickle是Python自带的序列化工具,能完美保留所有类型信息,包括键的类型。用法超简单:
import pickle my_dict = {1: "integer_key", "1": "string_key", 2: 100} # 写入文件 with open("my_dict.pkl", "wb") as f: pickle.dump(my_dict, f) # 读取文件 with open("my_dict.pkl", "rb") as f: loaded_dict = pickle.load(f) print(loaded_dict[1]) # 输出 "integer_key" print(loaded_dict["1"]) # 输出 "string_key"
唯一的小缺点是,非Python环境没法直接查看文件内容,虽然有工具能解析,但可读性不如纯文本格式。
2. 使用yaml(兼顾类型保留和外部可读性,首推!)
YAML格式天生支持不同类型的键,而且是纯文本,用普通编辑器就能直接查看映射关系。你只需要先装个pyyaml库(pip install pyyaml),然后这么用:
import yaml my_dict = {1: "integer_key", "1": "string_key", 2: 100} # 写入文件,sort_keys=False避免键被排序打乱顺序 with open("my_dict.yaml", "w") as f: yaml.dump(my_dict, f, sort_keys=False) # 读取文件 with open("my_dict.yaml", "r") as f: loaded_dict = yaml.load(f, Loader=yaml.FullLoader) print(type(list(loaded_dict.keys())[0])) # <class 'int'> print(type(list(loaded_dict.keys())[1])) # <class 'str'>
生成的YAML文件内容大概是这样的:
1: integer_key "1": string_key 2: 100
一眼就能区分整数键和字符串键,完全满足你“外部可查看映射”的需求,读回来也能完美保留所有类型。
3. 自定义纯文本格式(无依赖,适合简单场景)
如果不想用第三方库,也可以自己搞个简单的格式,比如每行用键类型:键内容:值类型:值内容的结构:
my_dict = {1: "integer_key", "1": "string_key", 2: 100} # 写入文件 with open("my_dict.txt", "w") as f: for k, v in my_dict.items(): key_type = type(k).__name__ val_type = type(v).__name__ # 用repr避免字符串里的特殊字符出问题 f.write(f"{key_type}:{repr(k)}:{val_type}:{repr(v)}\n") # 读取文件 loaded_dict = {} with open("my_dict.txt", "r") as f: for line in f: line = line.strip() if not line: continue key_type, key_str, val_type, val_str = line.split(":", 3) # 转换键类型 if key_type == "int": k = int(eval(key_str)) elif key_type == "str": k = eval(key_str) # 转换值类型 if val_type == "int": v = int(eval(val_str)) elif val_type == "str": v = eval(val_str) loaded_dict[k] = v print(loaded_dict[1]) # 输出 "integer_key"
这个方案完全不需要额外依赖,但需要自己处理类型转换,适合字典里的类型比较单一的场景。
总结一下,最推荐的是yaml方案,既省心又能完美满足所有需求。
内容的提问来源于stack exchange,提问作者jpp
相关产品推荐
相关产品推荐

