我正在使用字典进行排序。我想要实现的是:
对于我解析的每个XML文件,从文件(output.dict)加载现有字典,并对当前密钥进行比较/更新,并将其与现有值一起存储。我尝试使用has_key()和attributerror,它不起作用。
由于我一次尝试一个文件,因此会创建多个词典,无法进行比较。这就是我被困住的地方。
def createUpdateDictionary(servicename, xmlfile):
dictionary = {}
if path.isfile == 'output.dict':
dictionary.update (eval(open('output.dict'),'r'))
for event, element in etree.iterparse(xmlfile):
dictionary.setdefault(servicename, []).append(element.tag)
f = open('output.dict', 'a')
write_dict = str(dictionary2)
f.write(write_dict)
f.close()
(这里的servicename只不过是xmlfile的分裂'。',它形成了键,而元素的标签名称则没有值)
答案 0 :(得分:1)
def createUpdateDictionary(servicename, xmlfile):
dictionary = {}
if path.isfile == 'output.dict':
dictionary.update (eval(open('output.dict'),'r'))
有一个拼写错误,因为'r'
参数属于open()
,而不属于eval()
。此外,您无法评估open()
返回的文件对象,您必须首先read()
内容。
f = open('output.dict', 'a')
write_dict = str(dictionary2)
f.write(write_dict)
f.close()
在这里,您将字符串表示附加到文件中。字符串表示不保证完全代表字典。它意味着人类可以读取以允许检查,而不是持久保存数据。
此外,由于您使用'a'
附加数据,因此您将在文件中存储更新后的字典的多个副本。您的文件可能如下所示:
{}{"foo": []}{"foo": [], "bar":[]}
这显然不是你想要的;你以后甚至不能eval()
它(语法错误!)。
由于eval()
将执行任意Python代码,因此它被认为是 evil ,您实际上不应该将它用于对象序列化。要么使用pickle
,这是Python中标准的序列化方式,要么使用json
,这是其他语言支持的人类可读的标准格式。
import json
def createUpdateDictionary(servicename, xmlfile):
with open('output.dict', 'r') as fp:
dictionary = json.load(fp)
# ... process XML, update dictionary ...
with open('output.dict', 'w') as fp:
json.dump(dictionary, fp)