如何将键为tuple类型的dict写入.txt文件?
问题原因
JSON 标准规定对象的键必须为字符串类型,Python 的 json 模块对 int、float、bool 等基础类型键做了兼容处理,会自动将其转为字符串后序列化,但不支持 tuple 类型作为键,因此抛出对应 TypeError。
注意:你的代码中使用了Python内置类型名 dict 作为变量名,会覆盖内置的字典类,后续开发建议修改为自定义名称,避免命名冲突。
解决方案
方案1:使用pickle模块序列化(推荐用于Python内部数据存储)
如果你的数据仅在Python环境中读写,不需要跨语言兼容,pickle是最简单的方案,原生支持所有Python内置类型的序列化:
写入代码
import pickle my_dict = {(1, 1): 11, (2, 2): 22, (3, 3): 33, (4, 4): 44, (5, 5): 55, (6, 6): 66, (7, 7): 77, (8, 8): 88, (9, 9): 99} # 需使用二进制读写模式 with open('dict.pkl', 'wb') as file: pickle.dump(my_dict, file)
读取代码
import pickle with open('dict.pkl', 'rb') as file: loaded_dict = pickle.load(file) # 验证读取结果:输出 {(1, 1): 11, (2, 2): 22, (3, 3): 33, (4, 4): 44, (5, 5): 55, (6, 6): 66, (7, 7): 77, (8, 8): 88, (9, 9): 99} print(loaded_dict)
方案2:预处理键转为字符串,兼容标准JSON格式
如果需要存储为可读的纯文本、符合JSON标准,可在序列化时将tuple键转为字符串,反序列化时再还原为tuple:
写入代码
import json my_dict = {(1, 1): 11, (2, 2): 22, (3, 3): 33, (4, 4): 44, (5, 5): 55, (6, 6): 66, (7, 7): 77, (8, 8): 88, (9, 9): 99} # 预处理:将tuple类型的键转为字符串 serializable_dict = {str(k): v for k, v in my_dict.items()} with open('dict.txt', 'w') as file: file.write(json.dumps(serializable_dict))
读取代码
import json with open('dict.txt', 'r') as file: loaded_serializable = json.load(file) # 方式1:使用eval还原tuple键,仅适用于可信数据源 loaded_dict = {eval(k): v for k, v in loaded_serializable.items()} # 方式2:手动解析还原tuple键,适用于不可信数据源,更安全 # loaded_dict = {tuple(map(int, k.strip('()').split(', '))): v for k, v in loaded_serializable.items()} print(loaded_dict)
内容的提问来源于stack exchange,提问作者Drizzle
相关产品推荐
相关产品推荐

