Как сравнить значения в существующем словаре и обновить словарь обратно в файл? - PullRequest
0 голосов
/ 25 августа 2011

Я делаю что-то вроде утилиты со словарем.Я пытаюсь добиться этого:

для каждого файла XML, который я анализирую, существующий словарь загружается из файла (output.dict) и сравнивается / обновляется для текущего ключа и сохраняется вместе с существующимценности.Я пытался с has_key () и attributeterror, он не работает.

Поскольку я пробую один файл за раз, он создает несколько словарей и не может их сравнивать.Вот где я застрял.

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()

(здесь имя_службы - не что иное, как разделенный '.' Из xmlfile, который формирует ключ, а значения по имени тега элемента - ничто)

1 Ответ

1 голос
/ 25 августа 2011
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, он считается злым , и вам действительно не следует использовать его для сериализации объектов. Либо используйте 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...