Piszesz słownik do pliku tekstowego?


86

Mam słownik i próbuję zapisać go do pliku.

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

Mam wtedy błąd

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

Więc naprawiłem ten błąd, ale pojawił się inny błąd

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

Błąd:

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

Nie mam pojęcia, co robić, ponieważ nadal jestem początkującym użytkownikiem Pythona. Jeśli ktoś wie, jak rozwiązać problem, prosimy o udzielenie odpowiedzi.

UWAGA: używam Pythona 3, a nie Pythona 2

Odpowiedzi:


143

Przede wszystkim otwierasz plik w trybie do odczytu i próbujesz do niego pisać. Konsultacja - tryby IO python

Po drugie, do pliku można zapisywać tylko ciąg znaków. Jeśli chcesz napisać obiekt słownika, musisz przekształcić go w łańcuch lub serializować.

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

W przypadku serializacji

import cPickle as pickle

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

W przypadku pythona 3.x import pakietu pickle byłby inny

import _pickle as pickle

1
To się udało! Chociaż zapisuje tylko zawartość słownika. Czy możesz go napisać: exDict = {111: 111, 222: 222}
— Nic

Myślałem o tym, ale pomyślałem, że jest lepszy sposób. Ale działa, więc dziękuję!
— Nic

Jeśli nie jesteś zbyt przywiązany do =znaku, moja edycja może załatwić sprawę.
— hspandher

Tak jak wcześniej: file.write ('exDict =' + json.dumps (exDict)) działało dobrze, ponieważ używam go teraz.
— Nic

1
@JanKukacka JSON to standardowy format danych. To str(exDict), co dałoby, nie zawsze będzie prawidłowym kodem JSON. Jednym z powodów z tyłu głowy jest to, że pojedyncze cudzysłowy nie są prawidłowe w pliku JSON, podczas gdy mogą występować, gdy używamy strmetody.
— hspandher

49

Robię to tak w Pythonie 3:

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

1
Podoba mi się ten, ponieważ nie jest potrzebny import. Odpowiedź dalej powyżej data.write (str (słownik)) nie będzie działać z poprawnym słownikiem, ponieważ po prostu zapisze <class 'dict'> w twoim pliku
— Si Pon

Ciekawi mnie też, dlaczego nie po prostu wydrukować (mydictionary, file = open ('myfile.txt', 'w'))
— MadmanLee

@MadmanLee Myślę, że oba są w porządku i jest to kwestia tego, jak preferujemy wygląd naszego kodu.
— NKSHELL

1
with open ('myfile.txt', 'r') as f: content = f.read (); dic = eval (zawartość);
— NKSHELL

Powodem, dla którego json jest lepsze niż zwykłe zapisywanie str(mydict)do pliku, jest właśnie to, że nie potrzebujesz evalzawartości, aby odzyskać dictobiekt. evalto rosk bezpieczeństwa i nie powinien być używany, jeśli dostępne są lepsze opcje.
— 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
Odpowiedzi zawierające tylko kod są odradzane, ponieważ nie wyjaśniają, jak rozwiązują problem. Zaktualizuj swoją odpowiedź, aby wyjaśnić, w jaki sposób poprawia to w stosunku do innych zaakceptowanych i pozytywnie ocenionych odpowiedzi, które już ma to pytanie. Przejrzyj Jak napisać dobrą odpowiedź .
— FluffyKitten,

Powinieneś także używać withinstrukcji podczas czytania i zapisywania do plików: stackoverflow.com/questions/3012488/ ...
— Falko

13

Problem z pierwszym blokiem kodu polegał na tym, że otwierałeś plik jako „r”, mimo że chciałeś do niego pisać używając 'w'

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

to jest prawidłowa odpowiedź, ponieważ kod w pytaniu zawiera błąd.
— Ricardo Rivaldo

Kiedy próbuję użyć trasy json, otrzymuję błąd, ponieważ mam pewne wartości „NaN” w obiektach zmiennoprzecinkowych. Nie ma rozwiązania bez uszkodzenia samych danych, jeśli chcesz pisać w formacie JSON. Dlatego ta odpowiedź jest preferowana, ponieważ może zapisać plik tekstowy, aby dokładnie odzwierciedlić dyktando.
— pauljohn32

7

Jeśli potrzebujesz słownika, który możesz zaimportować z pliku według nazwy, a także dodaje wpisy, które są ładnie posortowane i zawierają ciągi znaków, które chcesz zachować, możesz spróbować tego:

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

Następnie do importu:

from file import dictionary_name

Działa to tylko dla łańcuchów, a nie dla innych typów w słowniku.
— Paul Kenjora

4

Dla miłośników rozumienia ze zrozumieniem listy wszystkie key : valuepary zostaną zapisane w nowych wierszachdog.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

Wiem, że to stare pytanie, ale pomyślałem również o udostępnieniu rozwiązania, które nie obejmuje json. Osobiście nie lubię json, ponieważ nie pozwala na łatwe dołączanie danych. Jeśli punktem początkowym jest słownik, możesz najpierw przekonwertować go na ramkę danych, a następnie dołączyć go do pliku 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')

Mam nadzieję, że to pomoże.


1
po co używać zewnętrznej biblioteki do prostego zadania? Python Simple to lepsza zasada.
— Ricardo Rivaldo

Niezbyt przydatne, ponieważ większość używanych przeze mnie słowników nie jest na tyle prosta, aby stać się użytecznymi obiektami DataFrame.
— pauljohn32

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


-2
import json

with open('tokenler.json', 'w') as file:
     file.write(json.dumps(mydict, ensure_ascii=False))

Możesz poprawić ten błąd, dodając wyjaśnienie, dlaczego to działa.
— Greg the Incredulous
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.