2013-11-09 4 views
0

Я изо всех сил пытаюсь написать/добавить словарь в текстовый файл. Используя 'a' мой словарь имеет форму {'word_one:' definition_one '} {' word_two: 'definition_two'} ... вместо того, что я думал, что я получу (и хотел) {'word_one:' definition_one ',' word_two: ' definition_two "...}. Что я делаю неправильно. Извините за такой основной вопрос. Я думал, что я понял, словари и писать текстовые файлы, но ... Кода:Python using append возвращает несколько словарей

import ast 
import operator 

def collectDict(): 

    # first initialize your final_dict and dante_dict dictionary 
    final_dict={} 
    with open('/Users/admin/Desktop/Dante Dictionary/experimental_dict.txt','r', encoding = "utf-8") as dic: 
      dante_dict = ast.literal_eval(dic.read())# reads text as a dictionary 


    (dante_dict,final_dict) = define_words(dante_dict,final_dict) # call the define_words function to update your dictionaries 


    # write your dictionaries 

    with open('/Users/admin/Desktop/Dante Dictionary/experimental_dict.txt', 'w', encoding = 'utf-8') as outfile: 
      outfile.write(str(dante_dict)) # writes source dictionary minus newly-defined term 

    with open('/Users/admin/Desktop/Dante Dictionary/trial_dictionary.txt', 'a', encoding = 'utf-8') as finalfile: 
      finalfile.write(str(final_dict)) 
    with open('/Users/admin/Desktop/Dante Dictionary/trial_dictionary.txt', 'r', encoding = 'utf-8') as finalfile: 
      prelim_dict = ast.literal_eval(finalfile.read()) 
      print(prelim_dict) 


def define_words(dante_dict,final_dict): 
    # your already written function without the initialization (first 3 lines) and file writing part 
    print('There were ', len(dante_dict), ' entries before defining this word') 
    key_to_find = max(dante_dict.items(), key=operator.itemgetter(1))[0] 
    print('The next word to define is ', key_to_find) # show which word needs defining 

    definition = input('Definition ? : ') # prompt for definition 
    final_dict = {} 

    if key_to_find in dante_dict: 
     final_dict.append[key_to_find] = definition 
     del dante_dict[key_to_find] # remove entry from source dictionary once new definition is done 
    print('the end length is : ' ,len(dante_dict)) # check that entry has been removed from source 

    return(dante_dict,final_dict) # you return the dictionaries for the other function 

Текстового файл, который я начать с:

{'amico ': 1, "'Segnor": 1, 'volgere': 1, 'spaventate,': 1, "s'avvantaggia": 1, 'livore': 1, 'disposta ': 1, 'pennelli': 1, 'atto': 15, 'Berti': 1, 'atti': 7, 'Gaia ': 1, 'alzato,': 1, 'reda': 2, "d'ossa": 1, 'rede': 1, 'solvesi': 1, 'Dopo': 3, 'amico,': 1, 'Sardi,': 1, 'pastore,': 2, 'sana ': 1,…} 
+0

[pickle] (http://docs.python.org/2/library/pickle.html) - это инструмент для этой задачи. –

ответ

1

final_dict является списка словарей , а не один словарь. Используя list.append(), вы продолжаете добавлять новые словари в этот список.

Сделать это словарь вместо, а затем назначить клавиши на этот словарь:

final_dict = {} 

if key_to_find in dante_dict: 
    final_dict[key_to_find] = definition 
    del dante_dict[key_to_find] 

Заметим, что нет смысла цикла по всей dante_dict ключи, чтобы увидеть, если ключ находится в нем, когда вы можете просто используйте key in dict, гораздо более быстрый метод. Выражение del dict[key] в конце заменяет выражение dante_dict.pop() в коде.

+0

Спасибо, что так терпеливы со мной. Теперь я получаю объект dict без добавления метода. Должен ли я использовать обновление или что я сделал неправильно еще раз? – user1478335

+0

@ user1478335: Ой, нет, это была ошибка копирования и вставки с моей стороны. Здесь '.append' не нужен. –

Смежные вопросы