Запис словника у текстовий файл?


86

У мене є словник і я намагаюся записати його у файл.

exDict = {1:1, 2:2, 3:3}
with open('file.txt', 'r') as file:
    file.write(exDict)

Тоді я маю помилку

file.write(exDict)
TypeError: must be str, not dict

Тож я виправив цю помилку, але прийшла інша помилка

exDict = {111:111, 222:222}
with open('file.txt', 'r') as file:
    file.write(str(exDict))

Помилка:

file.write(str(exDict))
io.UnsupportedOperation: not writable

Я не уявляю, що робити, оскільки я все ще новачок у python. Якщо хтось знає, як вирішити проблему, надайте відповідь.

ПРИМІТКА: Я використовую python 3, а не python 2

Відповіді:


142

Перш за все ви відкриваєте файл у режимі читання і намагаєтесь записати в нього. Зверніться - режими введення / виводу python

По-друге, ви можете написати лише рядок у файл. Якщо ви хочете написати об’єкт словника, вам потрібно або перетворити його на рядок, або серіалізувати.

import json

# as requested in comment
exDict = {'exDict': exDict}

with open('file.txt', 'w') as file:
     file.write(json.dumps(exDict)) # use `json.loads` to do the reverse

У разі серіалізації

import cPickle as pickle

with open('file.txt', 'w') as file:
     file.write(pickle.dumps(exDict)) # use `pickle.loads` to do the reverse

Для імпорту пакету засолу python 3.x буде інше

import _pickle as pickle

1
Це спрацювало! Хоча він пише лише зміст словника. Чи можете ви написати це: exDict = {111: 111, 222: 222}
Нік

Я думав про це, але думав, що є кращий спосіб. Це працює, хоча дякую!
Нік

Якщо ви не надто прикріплені =знаком, редагування, яке я зробив, може виконати цю роботу.
hspandher

Те, як у вас було раніше: file.write ('exDict =' + json.dumps (exDict)) у мене справно працювало, оскільки я зараз його використовую.
Нік

1
@JanKukacka JSON - це стандартний формат даних. Те, str(exDict)що дасть результат, не завжди буде дійсним JSON. Однією з причин потилиці є те, що одинарні лапки не є дійсними у файлі JSON, хоча можуть бути присутніми, коли ми використовуємо strметод.
hspandher

49

Я роблю це так у python 3:

with open('myfile.txt', 'w') as f:
    print(mydictionary, file=f)

1
Мені подобається цей, оскільки імпорт не потрібен. Відповідь далі над data.write (str (словник)) не буде працювати з правильним словником, оскільки він просто напише <class 'dict'> у вашому файлі
Сі Пн,

Мені також цікаво, чому б просто не надрукувати (mydictionary, file = open ('myfile.txt', 'w'))
MadmanLee,

@MadmanLee Я думаю, що з обома все гаразд, і справа в тому, як ми віддаємо перевагу нашому коду.
NKSHELL

1
з open ('myfile.txt', 'r') як f: content = f.read (); dic = eval (зміст);
NKSHELL

Причина, чому json кращий, ніж просто запис str(mydict)у файл, полягає саме в тому, що вам не потрібно evalвміст, щоб повернути dictоб'єкт назад. evalє захисним шпилем і не повинен використовуватися, якщо є кращі варіанти.
snakecharmerb

22
fout = "/your/outfile/here.txt"
fo = open(fout, "w")

for k, v in yourDictionary.items():
    fo.write(str(k) + ' >>> '+ str(v) + '\n\n')

fo.close()

12
Відповіді лише на код не рекомендується, оскільки вони не пояснюють, як вони вирішують проблему. Будь ласка, оновіть свою відповідь, щоб пояснити, як це покращує інші прийняті та схвалені відповіді на це питання. Будь ласка, перегляньте Як написати хорошу відповідь .
FluffyKitten

Крім того, ви повинні використовувати withвисловлювання при читанні та записі у файли: stackoverflow.com/questions/3012488/…
Фалько,

13

Проблема з вашим першим блоком коду полягала в тому, що ви відкривали файл як "r", хоча ви хотіли написати в нього за допомогою 'w'

with open('/Users/your/path/foo','w') as data:
    data.write(str(dictionary))

це правильна відповідь, оскільки код у запитанні має помилку.
Рікардо Рівальдо,

Коли я пробую маршрут json, я отримую помилку, оскільки у мене є деякі значення "NaN" у поплавках. Немає виправлення, не пошкодивши самі дані, якщо ви хочете написати JSON. Отже, ця відповідь є кращою, оскільки вона може зберегти текстовий файл для точного відображення вироку.
pauljohn32

7

Якщо вам потрібен словник, ви можете імпортувати з файлу за іменем, а також додає записи, які добре сортуються, і містить рядки, які ви хочете зберегти, ви можете спробувати це:

data = {'A': 'a', 'B': 'b', }

with open('file.py','w') as file:
    file.write("dictionary_name = { \n")
    for k in sorted (data.keys()):
        file.write("'%s':'%s', \n" % (k, data[k]))
    file.write("}")

Потім імпортувати:

from file import dictionary_name

Це працює лише для рядків, а не для інших типів у словнику.
Paul Kenjora,

4

Для любителів розуміння списку це запише всі key : valueпари в нові рядкиdog.txt

my_dict = {'foo': [1,2], 'bar':[3,4]}

# create list of strings
list_of_strings = [ f'{key} : {my_dict[key]}' for key in my_dict ]

# write string one by one adding newline
with open('dog.txt', 'w') as my_file:
    [ my_file.write(f'{st}\n') for st in list_of_strings ]

1

Я знаю, що це старе питання, але я також подумав поділитися рішенням, яке не включає json. Я особисто не дуже люблю json, оскільки він не дозволяє легко додавати дані. Якщо початковою точкою є словник, ви можете спочатку перетворити його у фрейм даних, а потім додати до свого файлу txt:

import pandas as pd
one_line_dict = exDict = {1:1, 2:2, 3:3}
df = pd.DataFrame.from_dict([one_line_dict])
df.to_csv('file.txt', header=False, index=True, mode='a')

Сподіваюся, це могло допомогти.


1
навіщо використовувати зовнішню бібліотеку для простого завдання? Python Simple - кращий принцип.
Рікардо Рівальдо,

Не дуже корисно, оскільки більшість словників, якими я користуюся, недостатньо прості, щоб стати корисними об’єктами DataFrame.
pauljohn32



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.