Jestem przyzwyczajony do wprowadzania i wyprowadzania danych z Pythona za pomocą plików .csv, ale są oczywiste wyzwania. Wszelkie porady na temat prostych sposobów przechowywania słownika (lub zestawów słowników) w pliku json lub pck? Na przykład:
data = {}
data ['key1'] = "keyinfo"
data ['key2'] = "keyinfo2"
Chciałbym wiedzieć, jak to zapisać, a następnie jak go ponownie załadować.
Odpowiedzi:
Zapisz marynowane :
Zobacz dokumentację modułu ogórkowy dodatkowych informacji odnośnie
protocol
argumentu.Ładunek marynowany :
JSON zapisz:
Podaj dodatkowe argumenty, takie jak
sort_keys
lub,indent
aby uzyskać ładny wynik. Argument sort_keys posortuje klucze alfabetycznie, a wcięcie spowoduje wcięcie struktury danychindent=N
spacjami.Obciążenie JSON :
źródło
pickle.dump
. Jeśli plik nie musi być czytelny dla człowieka, może to znacznie przyspieszyć.json.dump(data, fp, sort_keys=True, indent=4)
. : Więcej informacji można znaleźć tutajpickle.dump(data, fp, protocol=pickle.HIGHEST_PROTOCOL)
import pickle
Minimalny przykład, pisanie bezpośrednio do pliku:
lub bezpieczne otwieranie / zamykanie:
Jeśli chcesz zapisać go w ciągu zamiast w pliku:
źródło
Zobacz także przyspieszony pakiet ujson. https://pypi.python.org/pypi/ujson
źródło
Aby zapisać do pliku:
Aby odczytać z pliku:
myfile
jest obiektem dla pliku, w którym zapisałeś dykt.źródło
json.dump(myfile)
ijson.load(myfile)
Jeśli szukasz serializacji, ale nie potrzebujesz danych w innych programach, zdecydowanie polecam
shelve
moduł. Pomyśl o tym jak o trwałym słowniku.źródło
json
Bardziej wygodne jest przechowywanie całego nagrania lub wczytanie całego nagrania .shelve
jest lepszy tylko w przypadku uzyskiwania dostępu do jednego klucza na raz.Jeśli chcesz alternatywę dla
pickle
lubjson
, możesz użyćklepto
.Z
klepto
, gdybyś używałserialized=True
, słownik byłby zapisanymemo.pkl
jako słownik marynowany zamiast z czystym tekstem.Możesz uzyskać
klepto
tutaj: https://github.com/uqfoundation/kleptodill
jest prawdopodobnie lepszym wyborem do marynowania niżpickle
sam, ponieważdill
może serializować prawie wszystko w Pythonie.klepto
również można użyćdill
.Możesz uzyskać
dill
tutaj: https://github.com/uqfoundation/dillDodatkowe mumbo-jumbo w pierwszych kilku wierszach jest
klepto
możliwe, ponieważ można je skonfigurować do przechowywania słowników w pliku, w kontekście katalogu lub w bazie danych SQL. Interfejs API jest taki sam dla wszystkiego, co wybierzesz jako archiwum zaplecza. Daje ci słownik do archiwizacji, z którym możesz korzystaćload
idump
wchodzić w interakcje z archiwum.źródło
Jest to stary temat, ale dla kompletności powinniśmy dołączyć ConfigParser i configparser, które są częścią standardowej biblioteki odpowiednio w Pythonie 2 i 3. Moduł ten czyta i zapisuje do pliku config / ini i (przynajmniej w Pythonie 3) zachowuje się na wiele sposobów jak słownik. Ma tę dodatkową zaletę, że można przechowywać wiele słowników w osobnych sekcjach pliku config / ini i przywoływać je. Słodkie!
Przykład Python 2.7.x.
Przykład Python 3.X.
wyjście konsoli
zawartość config.ini
źródło
Jeśli zapisz w pliku json, najlepszym i najłatwiejszym sposobem na to jest:
źródło
json.dump( )
przedstawione w drugiej odpowiedzi?moim przypadkiem użycia było zapisanie wielu obiektów JSON w pliku, a odpowiedź Marty'ego nieco mi pomogła. Ale aby obsłużyć mój przypadek użycia, odpowiedź nie była kompletna, ponieważ zastąpiłaby stare dane za każdym razem, gdy zapisywany jest nowy wpis.
Aby zapisać wiele wpisów w pliku, należy sprawdzić starą zawartość (tzn. Przeczytać przed zapisem). Typowy plik zawierający dane JSON ma albo root,
list
alboobject
jako root. Uznałem więc, że mój plik json zawsze malist of objects
i za każdym razem, gdy dodam do niego dane, najpierw ładuję listę, dołączam do niej moje nowe dane i zrzucam z powrotem do instancji file (w
) tylko do zapisu :nowy plik json będzie wyglądał mniej więcej tak:
UWAGA: Ważne jest, aby mieć plik o nazwie
file.json
z[]
jak wstępnych danych dla tego podejścia do pracyPS: niezwiązane z pierwotnym pytaniem, ale to podejście można również ulepszyć, najpierw sprawdzając, czy nasz wpis już istnieje (na podstawie 1 / wielu kluczy), a dopiero potem dodając i zapisując dane. Daj mi znać, jeśli ktoś potrzebuje tej kontroli, dodam do odpowiedzi
źródło