【问题标题】:How to parse pickle dictionary in Python?如何在 Python 中解析 pickle 字典?
【发布时间】:2017-05-23 21:00:56
【问题描述】:

我正在使用字典。从不同的资源中,我了解到使用泡菜很舒服。我想使用 pickle 来保存三元组,例如: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 中,我试图读取信息并得到结果:

data: {'triple': DictClass(22, 'subClassOf', 44)}
repr(data): {'triple': DictClass(22, 'subClassOf', 44)}
data == eval(repr(data), {'DictClass':DictClass})?: True
File saved!
triple
File loaded!

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

【问题讨论】:

  • 所以你想使用json而不是pickle
  • 我会使用pickle,但当我不使用时,我会看到 JSON
  • 对不起,我完全不清楚你在问什么。
  • 因为您在循环中打开文件,所以它们只会将最后一个条目存储在数据 dict() 中。在进入循环之前打开文件并在之后关闭它。
  • 不要使用循环来保存你的字典。只需保存:pickle.dump(data, file_writemode),然后打开它:reader = pickle.load(file_readmode)

标签: python dictionary


【解决方案1】:

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

no 'triple': DictClass(17, 'subClassOf', 34) 在您的示例 data 中,因为您的示例 dict data 无效
密钥如果dict 必须是唯一的,则用第二个 'triple' 覆盖第一个 '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)

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

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

用 Python 测试:3.4.2

【讨论】:

  • 是的,你就在这里,但我看不到:'triple': DictClass(17, 'subClassOf', 34)
  • 谢谢你,我明白我的问题了!
猜你喜欢
  • 1970-01-01
  • 2016-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-09
  • 2011-01-29
  • 2014-03-30
相关资源
最近更新 更多