====== Обработка исключений. Итераторы, контейнеры и перечисления. Работа с файлами и каталогами ====== ===== Обработка исключений ===== В 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**, он содержит ряд более специализированных потомков\\