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 2 moduł pickle serializował obiekty do stringów (typ str) i używał plików tekstowych.
W Pythonie 3, przy korzystaniu z modułu pickle, trzeba otwierać i zamykać pliki w trybie binarnym (do zapisu "wb", do odczytu "rb"). Obiekty są serializowne do postaci bytes. Moduł pickle używa relatywnie zwartej reprezentacji binarnej, ale można jeszcze zmniejszyć rozmiar plików z danymi przez kompresję (pakiet compression od Py3.14).
import pickle
adict = {"a": "jeden", "b": "dwa"}
# Serializacja słownika do obiektu typu 'bytes'.
word = pickle.dumps(adict)
# Odtworzenie słownika z obiektu typu 'bytes'.
bdict = pickle.loads(word)
import pickle
adict = {"a": "jeden", "b": "dwa"}
# Zapisanie słownika w pliku.
afile = open("data.pickle", "wb") # Py3
pickle.dump(adict, afile)
afile.close()
# Odtworzenie słownika z pliku.
bfile = open("data.pickle", "rb") # Py3
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", "wb") # Py3
pickle.dump((alist, adict), afile)
afile.close()
# Odtworzenie elementów z pliku.
bfile = open("data.pickle", "rb") # Py3
(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", "wb") # Py3
pickle.dump(adict, afile)
pickle.dump(alist, afile)
afile.close()
# Odtworzenie danych z pliku (kolejność!).
bfile = open("data.pickle", "rb") # Py3
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ł anydbm 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 = dbm.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()