我正在读取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.py
和plotter.py
之间,我想要一个包含animals
和population
的文件,以便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
文件。
近期经验:
我看过pickle
和cpickle
,但我不确定如何让它发挥作用。如果这是正确的工具,示例代码将非常有用。可能还有其他工具我还不知道。
答案 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 _pickle
,with 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。后者实际上非常易读和可编辑。