https://docs.python.org/3/library/pickle.html
https://docs.python.org/3/library/shelve.html
https://docs.python.org/3/library/dbm.html
W Pythonie 3, przy korzystaniu z modułu pickle, trzeba otwierać i zamykać pliki w trybie binarnym (do zapisu "wb", do odczytu "rb").
import pickle adict = {"a": "jeden", "b": "dwa"} # Serializacja słownika do stringu. word = pickle.dumps(adict) # Odtworzenie słownika ze stringu. bdict = pickle.loads(word)
import pickle adict = {"a": "jeden", "b": "dwa"} # Zapisanie słownika w pliku. afile = open("data.pickle", "w") pickle.dump(adict, afile) afile.close() # Odtworzenie słownika z pliku. bfile = open("data.pickle", "r") bdict = pickle.load(bfile) bfile.close()
import pickle alist = [1, "a", 2, "b"] adict = {"a": "jeden", "b": "dwa"} # Zapisanie kilku elementów w pliku (w krotce). afile = open("data.pickle", "w") pickle.dump((alist, adict), afile) afile.close() # Odtworzenie elementów z pliku. bfile = open("data.pickle", "r") (blist, bdict) = pickle.load(bfile) bfile.close()
import pickle adict = {"a": "jeden", "b": "dwa"} alist = [1, "a", 2, "b"] # Zapisanie danych w pliku. afile = open("data.pickle", "w") pickle.dump(adict, afile) pickle.dump(alist, afile) afile.close() # Odtworzenie danych z pliku (kolejność!). bfile = open("data.pickle", "r") bdict = pickle.load(bfile) blist = pickle.load(bfile) bfile.close()
Jeżeli zrobimy peklowanie np. słownika z instancjami klasy X, to przed przywróceniem słownika trzeba sprawdzić, czy istnieje definicja klasy X.
Moduł implementuje system plików dostępu wg klucza, służący do przechowywania łańcuchów znaków.
#import anydbm as dbm # Py2 import dbm # Py3 # dbm - Generic interface to all dbm clones. d = anydbm.open(file, 'w') d[key] = data # store data at key (may override data at existing key) data = d[key] # retrieve data at key (raise KeyError if no such key) del d[key] # delete data stored at key (raises KeyError if no such key) flag = key in d # true if the key exists alist = d.keys() # return a list of all existing keys (slow!)
Moduł dumbdbm dostarcza bazę danych, która jest implementacją pliku o organizacji indeksowo-sekwencyjnej. Dla bazy danych spam istnieje plik indeksujący spam.dir (tekstowy), plik z danymi spam.dat (binarny), oraz czasem kopia pliku indeksującego spam.bak (tekstowy). Bazę obsługuje się tak jak zwykły słownik. W tej bazie danych klucze i wartości muszą być stringami. W razie potrzeby pewne obiekty możemy serializować za pomocą modułu pickle.
import dumbdbm # Py2 import pickle db = dumbdbm.open("data.dumbdbm") db["a"] = "Adam" db["b"] = "Bogdan" db["c"] = pickle.dumps([1, 3, 5]) print(db) print(db["b"]) print(pickle.loads(db["c"])) db.close() # zamknięcie bazy danych
Dzięki modułowi shelve mamy dostęp do danych analogiczny do słownika, ale możemy zachowywać obiekty dowolnego typu, nie tylko stringi. Moduł shelve implementuje interfejs BSD baz danych.
import shelve adict = {"a": "jeden", "b": "dwa"} alist = [1, "a", 2, "b"] db = shelve.open("data.shelve") db["adict"] = adict db["alist"] = alist print(db) # jak słownik print(db["alist"]) # alist.append(3) # to nie zmienia db["alist"] # db["alist"] = alist # trzeba na nowo zapisać alist w bazie blist = db["alist"] # odzyskujemy KOPIĘ danych print(len(db)) # liczba elementów w bazie print("alist" in db) # należenie do bazy # Inne metody: keys(), values(), items(), ... # Usuwanie danych: del db["alist"] # Czyszczenie bazy: db.clear() # Zamknięcie bazy. db.close()