Moduły bazodanowe

https://docs.python.org/3/library/pickle.html

https://docs.python.org/3/library/shelve.html

https://docs.python.org/3/library/dbm.html

MODUŁ pickle

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 (Py2) i dbm (Py3)

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 (Py2) i dbm.dumb (Py3)

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

MODUŁ shelve

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