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