Piszę program, który przechowuje dane w obiekcie słownika, ale dane te muszą zostać zapisane w pewnym momencie podczas wykonywania programu i ponownie załadowane do obiektu słownika po ponownym uruchomieniu programu. Jak przekonwertować obiekt słownika na ciąg, który można zapisać do pliku i załadować z powrotem do obiektu słownika? Mamy nadzieję, że będzie to wspierać słowniki zawierające słowniki.
python
json
dictionary
serialization
AJ00200
źródło
źródło
import json
jak ja!Jeśli twój słownik nie jest zbyt duży, być może str + eval może wykonać tę pracę:
Możesz użyć ast.literal_eval zamiast eval dla dodatkowego bezpieczeństwa, jeśli źródło jest niezaufane.
źródło
Używam
json
:źródło
Użyj
pickle
modułu, aby zapisać go na dysku i załadować później.źródło
Dlaczego nie skorzystać z wbudowanej funkcji biblioteki Python 3 ast literal_eval . Lepiej jest używać literal_eval zamiast eval
da wynik jako rzeczywisty słownik
A jeśli poprosisz o konwersję słownika na ciąg, to co powiesz na użycie metody str () Pythona.
Załóżmy, że słownik to:
I będzie to następująco:
Wydrukuje:
To takie proste, jak chcesz.
źródło
Jeśli w Chinses
źródło
Konwertuj słownik na JSON (ciąg)
dostanie cię:
Konwertuj ciąg na słownik
źródło
Myślę, że powinieneś rozważyć użycie
shelve
modułu, który zapewnia trwałe, podobne do słownika obiekty podobne do plików. Jest łatwy w użyciu zamiast „prawdziwego” słownika, ponieważ prawie transparentnie zapewnia Twojemu programowi coś, czego można używać podobnie jak słownik, bez potrzeby jawnej konwersji go na ciąg znaków, a następnie zapisania go w pliku (lub odwrotnie versa).Główną różnicą jest
open()
to,close()
że musisz to zrobić na początku przed pierwszym użyciem, a potem , gdy skończysz (i być może wsync()
zależności odwriteback
użytej opcji). Wszelkie tworzone obiekty plików „półki” mogą zawierać zwykłe słowniki jako wartości, co pozwala na ich logiczne zagnieżdżenie.Oto prosty przykład:
Wynik:
źródło
Jeśli zależy Ci na prędkości, skorzystaj z ujson (UltraJSON), który ma takie samo API jak json:
źródło
Używam do tego yaml, jeśli musi być czytelny (ani JSON, ani XML nie są tym IMHO), lub jeśli odczyt nie jest konieczny, używam marynaty.
pisać
Przeczytaj ponownie
źródło
b
flagi podczas otwierania pliku tutaj.dumps()
domyślnie jest to protokół 0, który jest protokołem ascii. Dlatego'rb'
nie jest konieczne IMHO.