2015-07-13 2 views
0

Моя цель - написать словарь для текста (чтобы мне не нужно было обращаться к базе данных), а затем сохраните информацию в текстовом файле как словарь. Это то, что я пробовал:Как написать словарь в текст, а затем прочитать текст в словаре в python

Чтобы написать словарь к тексту, я использовал

with open("match_histories.txt", "w") as text_file: 
    print("match_histories: {}".format(match_histories), file=text_file) 

Это, казалось, работало хорошо, и мой текстовый файл выглядит следующим образом:

match_histories: {'28718115': {'matches': [{'matchVersion': '5.13.0.329', ...

Я хочу сохранить это как словарь, поэтому я пробовал:

match_histories = {} 
f=open('match_histories.txt', 'r') 
match_histories= eval(f.read()) 

Однако, когда я запустил его, я получаю сообщение об ошибке при попытке сохранить новую dictiona гу. Я получаю следующую ошибку:

Traceback (most recent call last):

File "C:\Python34\Main.py", line 87, in

main()

File "C:\Python34\Main.py", line 82, in main

new_dict = eval(f.read())

File "", line 1

Как сохранить информацию из моего текстового файла в качестве словаря в Python?

Редактировать: Благодаря namooth проблема в том, что мой текстовый файл не был в действительном словаре. Как я не могу записать имя моего словаря в файл?

Редактировать 2: Вау, все очень полезно! Я думаю, что у меня есть это сейчас.

Edit 3: Я попытался рассол дамп, который был предложен, но я получил эту ошибку:

Traceback (most recent call last):

File "C:\Python34\Main.py", line 88, in

main()

File "C:\Python34\Main.py", line 79, in main

match_histories=get_match_histories(challenger_Ids)

File "C:\Python34\Main.py", line 47, in get_match_histories

pickle.dump(match_histories, "match_histories.txt")

TypeError: file must have a 'write' attribute

пишут:

pickle.dump(match_histories, "match_histories.txt") 

чтения:

match_histories = pickle.load("match_histories.txt") 

ли я до сих пор нужна строка, открывающая файл? Как исправить эту ошибку?

+0

Каков полный трасчёт, который вы получаете? – Leb

ответ

0

Проблема с текущим кодом является то, что вы добавляете префикс "match_histories: " перед repr вашего словаря. Python не может проанализировать эту часть текста, так что вы получите сообщение об ошибке, когда вы это сделаете eval.

Попробуйте просто писать repr словаря само по себе:

with open("match_histories.txt", "w") as text_file: 
    print(repr(history), file=text_file) 

Это будет работать, если все объекты, содержащиеся на любом уровне в словаре есть repr S, который может быть разобрана обратно в должным образом. Он не будет работать, если словарь содержит объекты с unhelpful repr s или если он содержит рекурсивные ссылки.

Лучший подход, вероятно, использовать pickle модули, чтобы сохранить загрузить данные в файл:

pickle.dump(history, "match_histories.txt") 

И позже:

new_dict = pickle.load("match_histories.txt") 

Вы также можете использовать json модуль, если вы хотите, чтобы текстовый файл был читаемым человеком.

0

Вы должны иметь действительный словарь синтаксис в текстовом файле. Ниже будет работать с загрузкой кода:

{'match_histories': {'28718115': {'matches': [{'matchVersion': '5.13.0.329', ...}

+0

Спасибо! это сработало. match_histories - это имя переменной (в коде там я назвал new_dict); возможно, это вообще не должно включаться в текстовый файл? Итак, как мне изменить свою «запись», чтобы не включать имя, которое я использовал для словаря? – Mark

+0

Я бы использовал 'text_file.write (str (history))', где история - это ваш словарь. – namooh

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