Модуль shelve Python
Для роботи з бінарними файлами в Python може застосовуватися ще один модуль - shelve. Він зберігає об'єкти в файл з певним ключем. Потім по цьому ключу може витягти раніше збережений об'єкт з файлу. Процес роботи з даними через модуль shelve нагадує роботу зі словниками, які також використовують ключі для збереження і вилучення об'єктів.
Для відкриття файлу модуль shelve використовує функцію open():
open (путь_к_файлу [, flag= " c " [, protocol=None [, writeback=False]]])
Де параметр flag може приймати значення:
- c: файл відкривається для читання і запису (значення за замовчуванням). Якщо файл не існує, то він створюється.
- r: файл відкривається тільки для читання.
- w: файл відкривається для запису.
- n: файл відкривається для запису Якщо файл не існує, то він створюється. Якщо він існує, то він перезаписується
Для закриття підключення до файлу викликається метод close():
import shelve
d = shelve.open(filename)
d. close()
Або можна відкривати файл за допомогою оператора with. Збережемо і прочитаємо у файл кілька об'єктів:
import shelve
FILENAME = " states2"
with shelve.open (FILENAME) as states:
states["London"] = "Great Britain"
states["Paris"] = "France"
states["Berlin"] = "Germany"
states["Madrid"] = "Spain"
with shelve.open (FILENAME) as states:
print(states["London"])
print(states["Madrid"])
Запис даних передбачає встановлення значення для певного ключа:
states["London"] = "Great Britain"
А читання з файлу еквівалентно отриманню значення по ключу:
print(states["London"])
В якості ключів використовуються строкові значення.
При читанні даних, якщо запитуваний ключ відсутній, то генерується виняток. У цьому випадку перед отриманням ми можемо перевіряти на наявність ключа за допомогою оператора in:
with shelve.open (FILENAME) as states:
key = "Brussels"
if key in states:
print(states[key])
Також ми можемо використовувати метод get(). Перший параметр методу - ключ, за яким слід отримати значення, а другий-значення за замовчуванням, яке повертається, якщо ключ не знайдений.
with shelve.open (FILENAME) as states:
state = states.get("Brussels", "Undefined")
print(state)
Використовуючи цикл for, можна перебрати всі значення з файлу:
with shelve.open (FILENAME) as states:
for key in states:
print(key," - ", states[key])
Метод keys() повертає всі ключі з файлу, а метод values() - всі значення:
with shelve.open (FILENAME) as states:
for city in states.keys():
print(city, end=" ") # London Paris Berlin Madrid
print()
for country in states.values():
print(country, end=" ") # Great Britain France Germany Spain
Ще один метод items() повертає набір кортежів. Кожен кортеж містить ключ і значення.
with shelve.open (FILENAME) as states:
for state in states.items():
print(state)
Консольний висновок:
("Paris", "France")
("Berlin", "Germany")
("Madrid", "Spain")
Оновлення даних
Для зміни даних досить привласнити по ключу нове значення, а для додавання даних - визначити новий ключ:
import shelve
FILENAME = " states2"
with shelve.open (FILENAME) as states:
states["London"] = "Great Britain"
states["Paris"] = "France"
states["Berlin"] = "Germany"
states["Madrid"] = "Spain"
with shelve.open (FILENAME) as states:
states["London"] = "United Kingdom"
states["Brussels"] = "Belgium"
for key in states:
print(key, " - ", states[key])
Видалення даних
Для видалення з одночасним отриманням можна використовувати функцію pop(), в яку передається ключ елемента і значення за замовчуванням, якщо ключ не знайдено:
with shelve.open (FILENAME) as states:
state = states.pop("London", "NotFound")
print(state)
Також для видалення може застосовуватися оператор del:
with shelve.open (FILENAME) as states:
del states["Madrid"] # видаляємо об'єкт з ключем Madrid
Для видалення всіх елементів можна використовувати метод clear():
with shelve.open (FILENAME) as states:
states.clear()