如何用文本文件保存读取大型嵌套数组以实现Python程序间共享?
这问题我太熟了!要实现嵌套数组在两个Python程序之间完美传递,核心就是把数组序列化(转成可存储的文本/二进制格式)到文件,再在另一个程序里反序列化(还原成原数组)。下面给你讲几种最实用的方法,每种都附代码示例,你可以根据需求选:
方法1:用JSON(最通用,跨语言友好)
JSON是个跨语言的轻量级格式,只要你的嵌套数组里是Python基本类型(列表、字典、字符串、数字、布尔值、None),用它准没错,而且生成的文件是纯文本,可读性强。
保存数组的代码(程序A):
import json # 假设这是你的大型嵌套数组 nested_array = [ [1, 2, 3], ["a", "b", ["x", "y", None]], [True, False, {"key": "value"}] ] # 写入文件,ensure_ascii=False支持中文等非ASCII字符,indent让格式更易读 with open("array_data.json", "w", encoding="utf-8") as f: json.dump(nested_array, f, ensure_ascii=False, indent=4)
读取数组的代码(程序B):
import json with open("array_data.json", "r", encoding="utf-8") as f: loaded_array = json.load(f) # 验证是否和原数组完全一致 print(loaded_array == nested_array) # 输出True
⚠️ 注意:JSON不支持Python特有的对象(比如datetime、自定义类实例、set),如果你的数组里有这些,得先转成JSON支持的类型,或者换别的方法。
方法2:用Pickle(Python专属,支持所有Python对象)
如果你的嵌套数组里有Python独有的对象,或者想原汁原味保留所有信息,Pickle是最佳选择——它能序列化几乎所有Python对象,而且体积小、速度快。
保存数组的代码(程序A):
import pickle # 示例:数组里包含自定义类实例 class MyClass: def __init__(self, value): self.value = value nested_array = [ [1, 2, 3], ["a", "b", ["x", "y", None]], [MyClass(100), MyClass(200)] ] # 注意用二进制模式写入 with open("array_data.pkl", "wb") as f: pickle.dump(nested_array, f)
读取数组的代码(程序B):
import pickle # 要确保两个程序里的自定义类定义完全一致 class MyClass: def __init__(self, value): self.value = value with open("array_data.pkl", "rb") as f: loaded_array = pickle.load(f) # 验证一致性 print(loaded_array[2][0].value == nested_array[2][0].value) # 输出True
⚠️ 重要提醒:Pickle是不安全的!绝对不要读取来源不明的Pickle文件,因为它在反序列化时会执行文件里的代码,可能被黑客利用。
方法3:用NumPy(适合数值型嵌套数组)
如果你的嵌套数组是纯数值类型(比如全是整数、浮点数),而且数据量很大,用NumPy的二进制格式会比JSON/Pickle高效得多,读写速度快,占用空间小。
保存数组的代码(程序A):
import numpy as np # 把Python列表转成NumPy数组 nested_array = np.array([ [1, 2, 3], [4.5, 5.6, 6.7], [7, 8, 9] ]) # 保存成.npy文件(单个数组) np.save("array_data.npy", nested_array) # 如果要存多个数组,用npz格式: # np.savez("array_data.npz", arr1=nested_array, arr2=another_array)
读取数组的代码(程序B):
import numpy as np # 读取.npy文件 loaded_array = np.load("array_data.npy") # 转成Python列表(如果需要的话) loaded_list = loaded_array.tolist() # 验证一致性 print(np.array_equal(loaded_array, nested_array)) # 输出True
方法4:用repr + eval(简单但不安全,不推荐)
如果你图省事,也可以把数组转成字符串(用repr()),然后写入文件,读取时用eval()还原。但这种方法风险极高——如果文件被篡改,eval()会执行恶意代码,所以只适合本地测试,绝对不要用于生产环境。
示例代码(不推荐):
# 保存 nested_array = [[1,2,3], ["a","b"]] with open("array_data.txt", "w") as f: f.write(repr(nested_array)) # 读取 with open("array_data.txt", "r") as f: loaded_array = eval(f.read())
总结怎么选:
- 要跨语言、可读性强、安全:选JSON
- Python专属、有复杂对象:选Pickle(注意仅读取可信文件)
- 数值型大数据量:选NumPy
- 绝对别用
eval除非你完全信任文件来源
内容的提问来源于stack exchange,提问作者user7296192
相关产品推荐
相关产品推荐

