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ł 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 = 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()