Для работы с бинарными файлами в Python может применяться еще один модуль — shelve. Он сохраняет объекты в файл с определенным ключом. Затем по этому ключу может извлечь ранее сохраненный объект из файла. Процесс работы с данными через модуль shelve напоминает работу со словарями, которые также используют ключи для сохранения и извлечения объектов.
Для открытия файла модуль shelve использует функцию open():
| 1 | open(путь_к_файлу[, flag="c"[, protocol=None[, writeback=False]]]) |
Где параметр flag может принимать значения:
- c: файл открывается для чтения и записи (значение по умолчанию). Если файл не существует, то он создается.
- r: файл открывается только для чтения.
- w: файл открывается для записи.
- n: файл открывается для записи Если файл не существует, то он создается. Если он существует, то он перезаписывается
Для закрытия подключения к файлу вызывается метод close():
| 1 2 3 | import shelved = shelve.open(filename)d.close() |
Либо можно открывать файл с помощью оператора with. Сохраним и считаем в файл несколько объектов:
| 1 2 3 4 5 6 7 8 9 10 11 12 | import shelveFILENAME = "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"]) |
Запись данных предполагает установку значения для определенного ключа:
| 1 | states["London"] = "Great Britain" |
А чтение из файла эквивалентно получению значения по ключу:
| 1 | print(states["London"]) |
В качестве ключей используются строковые значения.
При чтении данных, если запрашиваемый ключ отсутствует, то генерируется исключение. В этом случае перед получением мы можем проверять на наличие ключа с помощью оператора in:
| 1 2 3 4 | with shelve.open(FILENAME) as states:key = "Brussels"if key in states:print(states[key]) |
Также мы можем использовать метод get(). Первый параметр метода — ключ, по которому следует получить значение, а второй — значение по умолчанию, которое возвращается, если ключ не найден.
| 1 2 3 | with shelve.open(FILENAME) as states:state = states.get("Brussels", "Undefined")print(state) |
Используя цикл for, можно перебрать все значения из файла:
| 1 2 3 | with shelve.open(FILENAME) as states:for key in states:print(key," - ", states[key]) |
Метод keys() возвращает все ключи из файла, а метод values() — все значения:
| 1 2 3 4 5 6 7 | 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() возвращает набор кортежей. Каждый кортеж содержит ключ и значение.
| 1 2 3 4 | with shelve.open(FILENAME) as states:for state in states.items():print(state) |
Консольный вывод:
("London", "Great Britain")
("Paris", "France")
("Berlin", "Germany")
("Madrid", "Spain")
Обновление данных
Для изменения данных достаточно присвоить по ключу новое значение, а для добавления данных — определить новый ключ:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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(), в которую передается ключ элемента и значение по умолчанию, если ключ не найден:
| 1 2 34 | with shelve.open(FILENAME) as states:state = states.pop("London", "NotFound")print(state) |
Также для удаления может применяться оператор del:
| 1 2 3 | with shelve.open(FILENAME) as states:del states["Madrid"] # удаляем объект с ключом Madrid |
Для удаления всех элементов можно использовать метод clear():
| 1 2 3 | with shelve.open(FILENAME) as states:states.clear() |