====== Обработка исключений. Итераторы, контейнеры и перечисления. Работа с файлами и каталогами ======
===== Обработка исключений =====
В Python исключения используются **не только в случае ошибки но при каких либо событиях**, например конец списка (ValueError)\\
[[https://pythonworld.ru/tipy-dannyx-v-python/isklyucheniya-v-python-konstrukciya-try-except-dlya-obrabotki-isklyuchenij.html|Классы исключений]]
==== try..except..else..finally ====
try:
...
except [ [as ]]:
... # Блоков может быть несколько
else:
... # Выполняется если исключения не было
finally:
... # Выполняется в любом случае
try:
...
except (NameError, IndexError, EsheError) as err:
... # обработка нескольких исключений
print(err.__class__.__name__)
Более подробную инфу по исключению можно получить в **tracebask.exc_info()**, можно даже трассировку делать оО\\
==== with..as ====
Протокол "Менеджеров контекста" гарантирует выполнение завершающих действий, например закрытие файла, даже при исключениях.\\
Не совсем понял отличия от try..finally ..\\
В классе, который используется в этом блоке, должны быть еще спец функции **__enter__() и __exit__()**\\
==== Классы встроенных исключений ====
Все **встроенные исключения являются классами**, благодаря этому сохраняется **вложенная структура**\\
==== Пользовательские исключения ====
Для инициирования исключения предназначены функции: **raise** и **assert**\\
В первом случае указывается экземпляр (или объект) класса исключения, можно передавать параметры и т.д.\\
Во втором, делается проверка выражения и в случае "False", вызывается исключение\\
class myError(Exception):
...
try:
raise myError("Описание исключения")
except myError as err:
...
##############
try:
assert x>= 0, "Сообщение об ошибке"
except AssertionError as err:
print(err) # Покажет сообщение об ошибке
===== Итераторы, контейнеры и перечисления =====
==== Итераторы ====
Класс генерирующий **последовательности каких либо значений**. Могут быть полезны например в циклах for\\
В таком классе нужно переопределить спец методы: **__iter__()** (флаг такого класса и инициализация за одно) и **__next__()** (вызывается на каждой итерации), для окончания следует вызывать исключение **"StopIteration"**\\
==== Контейнеры ====
Могут выступать как последовательности (списки/кортежи) или отображения (словари), можно обращаться к элементам по индексу (ключу)\\
==== Перечисления ====
Набор каких-либо именованных значений, аналогичен перечислениям из С\\
from enum import Enum
class Versions(Enum):
v2_7= "2.7"
v3_6= "3.7"
===== Работа с файлами и каталогами =====
==== Открытие ====
Метод **open()**, путь можно передавать относительный, он автоматом преобразуется в абсолютный, методом **os.abspath()**\\
**Текущий каталог** скрипта тот **из которого он запущен** а не тот в котором он располагается\\
Сделать каталог текущим можно также функцией **os.chdir()**\\
Кодировка по умолчанию **Unicode**, указать можно аргументом функции open(.., **encoding='..'**)\\
При открытии можно задавать флаг буферизации, иначе сброс на диск происходит только при закрытии файла или метод **flush()**\\
==== Методы ====
Типа: **close(), write(), writelines(), writable(), read(), readline(), readlines(), __next__(), flush()**\\
**fileno()** дескриптор файла, **truncate()**- обрезка файла, **tell()**- текущая позиция указателя, **seek()**- установить указатель в указанную позицию\\
Так же есть атрибуты типа: **name, mode, closed, encoding, buffer**\\
==== Доступ (модуль os) ====
Здесь так же присутствует метод **open()**, в аргументах можно задать режим и уровень доступа\\
==== StringIO / BytesIO ====
Данные классы позволяют работать с содержимым файла (в ОЗУ) как с переменной (строковой либо байтовой с-но)\\
Методы во многом аналогичны методам работы с файлами.\\
==== Права доступа ====
Функция **os.access()** задает права доступа к объектам в linux-формате т.е. числовой (750 и тд.)\\
Так же есть варианты для проверки доступа\\
==== Манипулирование файлами ====
**copyfile(), copy(), copy2()**- копирования, отличается копированием (не копированием) сопутствующих метаданных, **move(), rename(), remove()**\\
Модуль os.path- **exists(), getsize(), getatime(), getmtime()**\\
Получить информацию о файле позволяет ф-я **os.stat()**, содержит расширенную информацию о файле\\
Пути файлов/каталогов:\\
**abspath(), isabs(), basename(), dirname(), split(), splitdrive(), splittext()**- работа с путями в т.д. проверка абсолютности, разбиение на имя диска (файла) и пути, объединение и т.д.\\
==== Перенаправление В/В ====
Можно перенаправить стандартные потоки в файлы:\\
import sys
my_out= sys.stdout
file= open(..)
sys.stdout= file
print("Вывод идет в файл")
sys.stdout=my_out
print("Вернули обратно")
==== Сохранение объектов в файл ====
Сохранить/восстановить объекты позволяют модули **pickle** и **shelve**\\
В первом есть: **dump()**, **load()**, можно сохранять/восстанавливать несколько объектов, последовательным вызовом\\
Модуль **shelve** позволяет сохранять объекты с заданным строковым ключом, по принципу сходному со словарем\\
==== Работа с каталогами ====
**getcwd(), chdir(), mkdir(), rmdir(), listdir(), walk()** последняя для обхода дерева\\
=== scandir() ===
Более продвинуты инструмент для обхода списка каталогов\\
==== Исключения файловых операций ====
Основной (родительский) класс для исключений при работе с каталогами - **OSError**, он содержит ряд более специализированных потомков\\