如何解析Python中的pickle字典?

时间:2017-05-23 21:00:57

标签: python dictionary

我正在使用字典。从不同的资源,我明白使用泡菜很舒服。我想使用pickle保存三元组,例如: > data3 Maui8 Maui7 Maui6 Olowalu Maalaea 1 1.01532397 0.7583463 -1.45102480 0.37355214 0.093384619 2 0.84997103 0.7802248 -1.47906584 0.57370139 0.000741584 3 0.65297103 0.9325412 -1.31256709 0.29211557 0.077706758 4 0.42029456 0.8041302 -1.36599992 0.15763796 0.018583624 5 0.15063769 0.5932333 -1.00933326 -0.03478742 0.073490340 6 0.14522593 0.4739607 -0.82896012 0.22469641 0.226357256 7 0.03779456 0.4774847 -0.09524122 0.42900612 0.194261484 8 -0.39651917 -0.2433839 0.07535580 -0.03204488 0.384578649 9 -0.99220544 -1.3080379 0.07143167 -0.57821403 0.012594818 10 -1.58116623 -1.3739277 -0.28876112 -1.34129239 -0.543698715 11 -1.68365642 -1.5527201 0.35511326 -0.99125508 -0.574656426 12 -1.67555838 -1.6044574 0.21679237 -1.05519787 -0.731770854 13 -1.64012701 -1.6975577 0.68442918 -1.20809587 -0.888636526 14 -1.22618583 -1.3975012 0.94365182 -0.84284090 -0.611341749 15 -1.12916623 -0.8248387 1.05953344 -0.86989314 -0.242448715 16 -1.11394684 -0.3294150 1.41744881 -0.45954904 -0.331766245 17 -0.41821140 -0.4312582 1.19811924 -0.45322699 -0.384893352 18 0.22428860 -0.2696410 1.14340119 -0.28008162 -0.323007387 19 0.69397114 -0.1249800 1.12954154 0.48571412 0.074298377 20 1.55118345 1.1953590 0.91711047 1.47251236 0.802606648 21 1.76527075 1.6837135 0.50540620 1.30325798 0.951992613 22 1.34356440 1.6247940 -0.09836573 1.21764394 0.794730708 23 1.59601480 0.9492149 -0.69564643 0.87988078 0.490006397 24 1.41023107 0.8847163 -1.09236948 0.73676048 0.436886096 > ACF<-acf(data3) > plot(ACF, type="l", max.mfrow=1) > lines(ACF$acf[-1, 2,3], lty=1, col="red", lwd=1) > lines(ACF$acf[-1, 2,4], lty=1, col="green", lwd=1) ,但后来我想加载它们并填充一个数组 假设,我的代码:

subject: predicate: object

通常,我想将数据保存在字典中,然后加载它并对其进行一些处理,但是我有一个问题。我无法访问加载数据的信息。在函数import pickle file_name = 'fna.txt' class DictClass: def __init__(self, subj, predicate, obj ): self.subj = subj self.predicate = predicate self.obj = obj def __repr__(self): return 'DictClass(%r, %r, %r)' % (self.subj, self.predicate, self.obj) def __eq__(self, other): return (self.subj == other.subj) and (self.predicate == other.predicate) and (self.obj == other.obj) data = {'triple': DictClass(17,'subClassOf', 34), 'triple': DictClass(22,'subClassOf', 44)} print('data:', data) print('repr(data):', repr(data)) print("data == eval(repr(data), {'DictClass':DictClass})?:", data == eval(repr(data), {'DictClass':DictClass})) # Load the dictionary back from the pickle file. def ld_dict(fname): reader = pickle.load(open(fname, 'rb')) print(reader) return True # Save a dictionary into a pickle file. def sv_dict(fname): pickle.dump( data, open( fname, "wb" ) ) return True if(sv_dict(file_name)): print('File saved!') if(ld_dict(file_name)): print('File loaded!') 中,我试图读取信息并得到结果:

ld_dict

我如何获取信息,例如JSON。如何解析我在这里找到的JSON(How to parse json data in Python?)。另外,我已经看到了这个资源:how to save a dictionary in pickle感谢您的帮助

1 个答案:

答案 0 :(得分:1)

  

评论:...但我看不到:'triple':DictClass(17,'subClassOf',34)

     
    

您的示例'triple': DictClass(17, 'subClassOf', 34)中有 data,因为您的示例dict data 无效
    dict中的必须唯一,您使用第二<覆盖第一个 'triple' / strong> 'triple'。也许你想要list而不是dict

  
  

问题:我无法访问已加载数据的信息。

您返回相同 data object,将variable加入instance

  

注意:   我在内存dumps/loads中使用,替换为dump/load来写入/读取文件。

这对我有用,例如:

def print_data(d):
    print('data:', d)
    print('repr(data):', repr(d))
    print("data == eval(repr(data), {'DictClass':DictClass})?:", data == eval(repr(d), {'DictClass':DictClass}))
    print('\n')

data = {'triple': DictClass(17, 'subClassOf', 34), 'triple': DictClass(22, 'subClassOf', 44)}
print_data(data)

#pickle.dump( data, open( fname, "wb" ) )
data_pickeld = pickle.dumps( data )

#data_unpickeld = pickle.load(open(fname, 'rb'))
data_unpickeld = pickle.loads( data_pickeld)

print_data(data_unpickeld)
  

<强>输出
  data:{'triple':DictClass(22,'subClassOf',44)}
  repr(data):{'triple':DictClass(22,'subClassOf',44)}
  data == eval(repr(data),{'DictClass':DictClass})?:True

     

数据:{'triple':DictClass(22,'subClassOf',44)}
  repr(data):{'triple':DictClass(22,'subClassOf',44)}
  data == eval(repr(data),{'DictClass':DictClass})?:True

使用Python测试:3.4.2