Содержание

Обработка исключений. Итераторы, контейнеры и перечисления. Работа с файлами и каталогами

Обработка исключений

В Python исключения используются не только в случае ошибки но при каких либо событиях, например конец списка (ValueError)
Классы исключений

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, он содержит ряд более специализированных потомков