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)