如何存储然后从文件中检索Python本机数据结构?

时间:2010-08-28 05:35:20

标签: python file pickle

我正在读取XML文件并将所需数据重组为Python数据结构(列表,元组等)

例如,我的一个XML解析器模块生成以下数据:

# data_miner.py
animals = ['Chicken', 'Sheep', 'Cattle', 'Horse']
population = [150, 200, 50, 30]

然后我有一个粗略说明的绘图仪模块,例如:

# plotter.py
from data_miner import animals, population

plot(animals, population)

使用这种方法,我每次绘图时都必须解析XML文件。我还在测试我的程序的其他方面,XML文件现在不经常更改。避免解析阶段会大大缩短我的测试时间。

这是我想要的结果:
data_miner.pyplotter.py之间,我想要一个包含animalspopulation的文件,以便plotter.py本地访问它们(例如,绘图中没有变化)代码),无需每次都运行data_miner.py。如果可能,它不应该是csv或任何ASCII格式,只能是本机可访问的格式。 plotter.py现在看起来应该大致如下:

# plotter.py

# This line may not necessarily be a one-liner.
from data_file import animals, population

# But I want this portion to stay the same
plot(animals, population)

打个比方:
这大致相当于MATLAB的save命令,该命令将活动工作区的变量保存到.mat文件中。我正在寻找类似于Python的.mat文件。

近期经验:
我看过picklecpickle,但我不确定如何让它发挥作用。如果这是正确的工具,示例代码将非常有用。可能还有其他工具我还不知道。

4 个答案:

答案 0 :(得分:5)

pickle模块或更快的等效cPickle应该能够满足您的需求。

具体做法是:

# data_miner.py
import pickle

animals = ['Chicken', 'Sheep', 'Cattle', 'Horse']
population = [150, 200, 50, 30]

with open('data_miner.pik', 'wb') as f:
  pickle.dump([animals, population], f, -1)

# plotter.py
import pickle

with open('data_miner.pik', 'rb') as f:
    animals, population = pickle.load(f)

print animals, population

在这里,我已经data_miner.py非常明确地表达了需要保存的内容(除非你有非常具体的理由否则,否则总是一个非常明确的想法)。有些东西(例如模块和打开的文件)无论如何都无法被腌制,所以简单地腌制globals()是行不通的。

如果您绝对必须,可以制作globals()的副本,同时删除所有类型使其不适合保存的对象;或者,或许更好的是,在想要保存的每个名称中使用一个前导_(所以import pickle as _picklewith open ... as _f等等)和使用这种方法从globals()所有具有前导下划线==的名称中排除pickle.load将检索dict,然后通过索引从中提取感兴趣的变量。不过,我强烈建议您使用特定的值保存list(或dict,如果您愿意;-),而不是采取“批发”的方法。

答案 1 :(得分:2)

如果你要保存特定于Python的对象,那么酸洗是很好的。如果它们只是某种基本容器类型中的通用数据,那么JSON就可以了。

>>> json.dumps(['Chicken', 'Sheep', 'Cattle', 'Horse'])
'["Chicken", "Sheep", "Cattle", "Horse"]'
>>> json.dump(['Chicken', 'Sheep', 'Cattle', 'Horse'], sys.stdout) ; print
["Chicken", "Sheep", "Cattle", "Horse"]
>>> json.loads('["Chicken", "Sheep", "Cattle", "Horse"]')
[u'Chicken', u'Sheep', u'Cattle', u'Horse']

答案 2 :(得分:1)

pickle就是为此而设计的。使用pickle.dump将对象写入文件,并使用pickle.load将其读回。

>>> data
{'animals': ['Chicken', 'Sheep', 'Cattle', 'Horse'], 'population': [150, 200, 50, 30]}
>>> f = open('spam.p', 'wb')
>>> pickle.dump(data, f)
>>> f.close()
>>> f = open('spam.p', 'rb')
>>> pickle.load(f)
{'animals': ['Chicken', 'Sheep', 'Cattle', 'Horse'], 'population': [150, 200, 50, 30]}

答案 3 :(得分:0)

如前所述,这里通常使用泡菜。请记住,并非所有内容都是可序列化的(即文件,套接字,数据库连接)。

使用简单的数据结构,您还可以选择json或yaml。后者实际上非常易读和可编辑。