如何比较现有字典中的值并将字典更新回文件?

时间:2011-08-25 06:47:00

标签: python dictionary conditional-statements

我正在使用字典进行排序。我想要实现的是:

对于我解析的每个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的分裂'。',它形成了键,而元素的标签名称则没有值)

1 个答案:

答案 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)