Модули 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()
модуля shutilos.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
, поскольку они могут содержать самовыполняющийся код