Модули os, shutil и shelve

Конспект посвящён модулям os и shutil, которые могут быть полезны для работы с операционной системой, управлением каталогами и файлами, а также модулю shelve, позволяющему сериализовывать объекты Python
Модуль os
Для использования: import os
Модуль os позволяет взаимодействовать с операционной системой. Например, мы можем перемещаться по папкам, получить информацию о файле, посмотреть и изменить переменные среды (окружения), переместить файлы и так далее. Посмотрим на некоторые функции и объекты, которые мы можем использовать.
-
os.getcwd()возвращает рабочий каталог (тот, в котором пользователь сейчас находится). -
os.chdir(path)перемещает пользователя в директорию, которая была передана в функцию. -
os.listdir(path)возвращает случайно упорядоченный список файлов и каталогов, которые находятся в текущем каталоге (если ничего не было передано), либо список объектов в директории по переданному пути. -
os.scandir(path)возвращает итератор объектовos.DirEntry, представленные в виде записей каталогаpath.
os.DirEntry— класс, объекты которого являются файлами или каталогами. Рассмотрим некоторые атрибуты и методы.obj.name— имя файла/каталога;obj.path— путь к файлу/каталогу, который будет начинаться с папки, переданной в путиos.scandir()первой;obj.is_dir()возвращаетTrue, еслиobjявляется папкой, иначе —False;obj.is_file()возвращаетTrue, еслиobjявляется файлом, иначе —False;obj.stat()возвращает объектos.stat_result(см. ниже) дляobj, как если бы была вызванаos.stat(path)(см. ниже), гдеobjявляется конечным вpath.
-
os.mkdir(path)создаёт одну(!) папку, путь которой был передан в функцию.
FileExistsError, а если путь не найден, ошибку (исключение) FileNotFoundError. В дальнейшем упоминания об этих ошибках будут зачастую опускаться, где это совсем очевидно-
os.makedirs(path, exist_ok=False)рекурсивно создаёт папки, путь которых был передан в качестве аргумента, то есть в отличии отmkdir(), функцияmakedirs()создаёт все папки промежуточного уровня, которые должны содержать конечный каталог. Параметрexist_okимеет значениеFalseпо умолчанию, при котором в случае наличия одноимённой папки в рабочей директории функция вернёт ошибкуFileExistsError, но если задатьexist_ok=True, функция проигнорирует создание папки и не вернёт ошибку. -
os.rm_dir(path)удаляет папку по переданному пути, если она пуста. В ином случае вернёт ошибку, зависящую от ОС , внутри которой ведётся работа (OSError). -
os.removedirs(path)рекурсивно удаляет каталоги, начиная с последнего указанного в пути. Если какая-то из папок в пути окажется непустой, вызывает ошибкуOSError, которая игнорируется. -
os.remove(path)удаляет файл в путиpath. Если передана папка, или файл не существует, возвращает соответствующие ошибки. -
os.rename(src, dst)переименовывает файл или пустую папку сsrcнаdst(могут быть представлены как пути), причём если указать файлу другой путь, он будет перемещён в него. -
os.replace(src, dst)по функционалу аналогиченos.rename(), но для поддержки кроссплатформенности рекомендуется использовать именноos.replace(). -
os.chown(path, uid, gid)меняет идентификатор владельца объекта по путиpathна числовыеuid,gid. Чтобы изменить владельца по имени пользователя/группы, обратитесь к функцииshutil.chown()модуля shutil -
os.stat(path)возвращает объектstat_result, который содержит разного рода информацию о файле или папке. Рассмотрим атрибуты этого объекта:st_mode: Режим файла: тип файла и биты режима файла (разрешения).st_ino: Зависит от платформы, но если значение не равно нулю, однозначно идентифицирует файл по заданному значениюst_dev.inodeномер для Unix; индекс файла для Windows.st_dev: Идентификатор устройства, в котором находится файл.st_nlink: Количество жёстких ссылок.st_uid: Идентификатор пользователя владельца файла.st_gid: Идентификатор группы пользователей владельцев файла.st_size: Размер файла в байтах, если это обычный файл или символьная ссылка. Размер символьной ссылки - это длина пути, который она содержит, без завершающего нулевого байта.st_atime: Время последнего доступа в секундах.st_mtime: Время последней модификации содержимого в секундах.st_ctime: Время последнего изменения метаданных в секундах.st_birthtime: Время создания файла. Атрибут доступен не всегда и может вызвать ошибку (исключение)AttributeError.- и другие.
-
os.walk(top, topdown=True, onerror=False)генерирует дерево каталогов, начиная сtop(либо с конца доtop, еслиtopdown=False). Для каждого каталога в дереве возвращает кортеж(dirpath, dirnames, filenames), гдеdirpath— путь к каталогу,dirnames— список имён подкаталогов вdirpathиfilenames— список имён файлов вdirpath.
|
|
|
|
-
os.system(command)выполняет переданную командуcommand, будто она написана в терминале. Таким образом можно создавать файлы папки, перемещаться по каталогам и т.д. Если команда сгенерирует какой-либо вывод, он будет перенаправлен в поток вывода интерпретатора. В Windows возвращаемое значение равно значению, возвращаемому системной оболочкой после выполнения команды (задаётся переменной средыCOMSPEC: обычно cmd.exe) -
os.environ— объект, подобный словарю (mapping object), содержащий переменные среды окружения системы. -
os.sep— разделитель пути в операционной системе.'/'для POSIX и'\\'для Windows
Подмодуль os.path
-
os.path.split(path)разбивает переданный путь на парный кортеж(head, tail), гдеtail— последний компонент пути (всегда без косой черты), аhead— всё остальное. При этом: еслиpathзавершился косой чертой,tailбудет пуст; если вpathнет ни одной косой черты,headбудет пуст; еслиpathпуст, оба элемента кортежа будут пустыми. -
os.path.splitext(path)разбивает переданный путь на парный кортеж(root, ext), гдеroot + ext = pathиext— расширение файла с точкой, аroot— всё остальное. -
os.path.dirname(path)возвращает первый элемент кортежа от функцииos.path.split(), то есть путь до конечного файла/каталога не включая. -
os.path.basename(path)возвращает второй элемент кортежа от функцииos.path.split(), то есть имя конечного файла/каталога. -
os.path.join(path, *paths)объединяет один или несколько сегментов пути. Возвращает строку, состоящую из объединенияpathи всех элементов*paths, которые разделяютсяos.sep, кроме последнего (если тот не пуст).
|
|
-
os.path.exists(path)возвращаетTrue, еслиpathссылается на существующий путь, иначе —False. -
os.path.isabs(path)возвращаетTrue, если путь является абсолютным, иначе —False. В случае отсутствия пути возвращает исключениеOSError. -
os.path.isdir(path)возвращаетTrue, если путь существует и является каталогом, иначе —False. -
os.path.isfile(path)возвращаетTrue, если путь существует и является файлом, иначе —False. -
os.path.abspath(path)возвращает абсолютный путь.
Модуль shutil
Модуль shutil предлагает ряд высокоуровневых операций с файлами и коллекциями файлов. Например функции, которые поддерживают копирование и удаление файлов. Разберём основные возможности этого модуля.
shutil.copy(), shutil.copy2()) не могут скопировать все метаданные файла. Например в Windows, владельцы файлов, списки контроля доступа и альтернативные потоки данных не копируются.-
shutil.copy(src, dst)копирует файлаsrcв файл или директориюdst, при этом оба аргумента передаются как пути. -
shutil.copy2(src, dst)идентична функцииcopy(), за исключением того, что функцияcopy2()также пытается сохранить метаданные файла. -
shutil.copyfileobj(fsrc, fdst)копирует содержимое файлаsrc—fsrc(получается, например, при открытии файла с помощьюopen()) в объект файлаfdst. -
shutil.ignore_patterns(*patterns)создаёт функцию, которая может быть использована в качестве аргумента для параметраignoreфункцииshutil.copytree()(см. ниже). В результате файлы и каталоги, подходящие под (хотя бы) один из переданных шаблонов будут игнорироваться при копировании. -
shutil.copytree(src, dst, dirs_exist_ok=False, ignore=None)рекурсивно копирует дерево каталогов из папкиsrcв папкуdstи возвращаетdst. Если установитьdirs_exist_ok=True, исключение вызвано НЕ БУДЕТ, если целевой каталог с именемdstуже существует.
Если задано значениеignore, то это должен быть вызываемый объект, который получит в качестве своих аргументов текущий каталог, посещаемый функциейcopytree(), и список его содержимого, возвращаемый функциейos.listdir(), например функция, возвращаемаяshutil.ignore_patterns()или самописная функция. -
shutil.rmtree(path)удаляет дерево каталогов по переданному пути. -
shutil.copymode(src, dst)копирует права доступа с файла по путиsrcв файлdst. -
shutil.copystat(src, dst)копирует время последнего доступа, время последнего изменения и флаги(чтение, запись и т.д.) изsrcвdst. -
shutil.move(src, dst, copy_function=copy2)рекурсивно перемещает файл или директориюsrcв директориюdstи возвращаетdst. Если место назначенияdstнаходится в текущей файловой системе, тогда неявно используется функцияos.rename(). В противном случаеsrcкопируется вdstс помощью функции, переданной в аргументcopy_function, а затем удаляется. -
shutil.which(path)возвращает абсолютный путь к исполняемому файлу, путь которых прописан в PATH (переменные среды) -
shutil.disk_usage(path)возвращает статистику использования диска по указанному пути в виде именованного кортежа с атрибутамиtotal— общий объём диска,used— используемый объём иfree— свободное пространство в байтах. -
shutil.chown(path, user=None, group=None)меняет владельца объекта по путиpathнаuserиgroup.userможет быть системным именем пользователя или uid; то же самое относится и кgroup. Требуется как минимум один аргумент. -
shutil.make_archive(name, format, root_dir)создаёт архивный файл папки/файлаroot_dirс именемname(может быть указан как путь) в форматеformatи возвращаетname. -
shutil.unpack_archive(filename, extract_dir)распаковывает архив с именемfilenameв папкуextract_dir. -
shutil.get_archive_formats()возвращает список всех поддерживаемых форматов архивов.
Модуль shelve
Модуль shelve сохраняет произвольные объекты Python в файл с определенным ключом (типа str), т.е. такие объекты, которые может обработать модуль pickle (большинство экземпляров классов, рекурсивных типов данных и объектов, содержащих множество общих подобъектов). Затем по этому ключу может извлечь ранее сохраненный объект из файла. В отличии от pickle, shelve более удобен, когда требуется сериализовать множество объектов.
Функция shelve.open()
shelve.open(filename, flag='c') возвращает объект key-value хранилища, похожий на словарь (объект называется shelf). В filename передаётся имя открываемого/создаваемого файла, flag принимает одно из следующих значений:
'c'— файл открывается для чтения и записи. Если файл отсутствует, он создаётся;'r'— файл открывается для чтения;'w'— файл открывается для записи;'n'— файл открывается для для записи. Если файл отсутствует, он создаётся. Если существует, перезаписывается.
Объекты shelf поддерживают большинство методов и операций, поддерживаемых словарями (за исключением копирования, конструкторов и операторов | и |=). Запись/чтение данных shelf также происходит подобно записи/чтению данных словаря. Посмотрим пример:
|
|
Программа создаёт три файла разных расширений: dat, bak, dir, в которых содержится одна и та же сериализованная протоколом pickle информация.
pkl файлы и файлы, которые создаются shelve, поскольку они могут содержать самовыполняющийся код
cloudtips