Модуль os
Модуль os предоставляет множество функций для работы с операционной системой, причём их поведение, как правило, не зависит от ОС, поэтому программы остаются переносимыми. Здесь будут приведены наиболее часто используемые из них.
Будьте внимательны: некоторые функции из этого модуля поддерживаются не всеми ОС.
os.name — имя операционной системы. Доступные варианты: ‘posix’, ‘nt’, ‘mac’, ‘os2’, ‘ce’, ‘java’.
os.environ — словарь переменных окружения. Изменяемый (можно добавлять и удалять переменные окружения).
os.getlogin() — имя пользователя, вошедшего в терминал (Unix).
os.getpid() — текущий id процесса.
os.uname() — информация об ОС. возвращает объект с атрибутами: sysname — имя операционной системы, nodename — имя машины в сети (определяется реализацией), release — релиз, version — версия, machine — идентификатор машины.
os.access(path, mode, *, dir_fd=None, effective_ids=False, follow_symlinks=True) — проверка доступа к объекту у текущего пользователя. Флаги: os.F_OK — объект существует, os.R_OK — доступен на чтение, os.W_OK — доступен на запись, os.X_OK — доступен на исполнение.
os.chdir(path) — смена текущей директории.
os.chmod(path, mode, *, dir_fd=None, follow_symlinks=True) — смена прав доступа к объекту (mode — восьмеричное число).
os.chown(path, uid, gid, *, dir_fd=None, follow_symlinks=True) — меняет id владельца и группы (Unix).
os.getcwd() — текущая рабочая директория.
os.link(src, dst, *, src_dir_fd=None, dst_dir_fd=None, follow_symlinks=True) — создаёт жёсткую ссылку.
os.listdir(path=».») — список файлов и директорий в папке.
os.mkdir(path, mode=0o777, *, dir_fd=None) — создаёт директорию. OSError, если директория существует.
os.makedirs(path, mode=0o777, exist_ok=False) — создаёт директорию, создавая при этом промежуточные директории.
os.remove(path, *, dir_fd=None) — удаляет путь к файлу.
os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None) — переименовывает файл или директорию из src в dst.
os.renames(old, new) — переименовывает old в new, создавая промежуточные директории.
os.replace(src, dst, *, src_dir_fd=None, dst_dir_fd=None) — переименовывает из src в dst с принудительной заменой.
os.rmdir(path, *, dir_fd=None) — удаляет пустую директорию.
os.removedirs(path) — удаляет директорию, затем пытается удалить родительские директории, и удаляет их рекурсивно, пока они пусты.
os.symlink(source, link_name, target_is_directory=False, *, dir_fd=None) — создаёт символическую ссылку на объект.
os.sync() — записывает все данные на диск (Unix).
os.truncate(path, length) — обрезает файл до длины length.
os.utime(path, times=None, *, ns=None, dir_fd=None, follow_symlinks=True) — модификация времени последнего доступа и изменения файла. Либо times — кортеж (время доступа в секундах, время изменения в секундах), либо ns — кортеж (время доступа в наносекундах, время изменения в наносекундах).
os.walk(top, topdown=True, onerror=None, followlinks=False) — генерация имён файлов в дереве каталогов, сверху вниз (если topdown равен True), либо снизу вверх (если False). Для каждого каталога функция walk возвращает кортеж (путь к каталогу, список каталогов, список файлов).
os.system(command) — исполняет системную команду, возвращает код её завершения (в случае успеха 0).
os.urandom(n) — n случайных байт. Возможно использование этой функции в криптографических целях.
os.path — модуль, реализующий некоторые полезные функции на работы с путями.
Для вставки кода на Python в комментарий заключайте его в теги
Модуль os#
Модуль os позволяет работать с файловой системой, с окружением, управлять процессами.
В этом подразделе рассматриваются лишь несколько полезных возможностей. За более полным описанием возможностей модуля можно обратиться к документации или статье на сайте PyMOTW.
In [1]: import os
os.environ#
os.environ возвращает словарь с переменными окружения и их значениями. Можно использовать синтаксис обращения по ключу через квадратные скобки, если переменная окружения точно существует (если переменной нет возникнет исключение).
In [2]: os.environ["HOME"] Out[2]: '/home/nata' In [3]: os.environ["TOKEN"] --------------------------------------------------------------------------- KeyError Traceback (most recent call last) Input In [3], in cell line: 1>() ----> 1 os.environ["TOKEN"] File ~/venv/pyneng-py3-8-0/lib/python3.8/os.py:673, in _Environ.__getitem__(self, key) 670 value = self._data[self.encodekey(key)] 671 except KeyError: 672 # raise KeyError with the original key value --> 673 raise KeyError(key) from None 674 return self.decodevalue(value) KeyError: 'TOKEN'
Или использовать get, тогда при отстутствии переменной окружения, возвращается None:
In [3]: os.environ.get("HOME") Out[3]: '/home/nata' In [4]: os.environ.get("TOKEN")
Технически os.environ возвращает объект типа mapping, но на данном этапе проще считать его словарем.
Переменные окружения считываются в момент импорта модуля os, если какие-то переменные были добавлены во время работы скрипта, они не будут доступны через os.environ .
os.mkdir#
os.mkdir позволяет создать каталог:
In [2]: os.mkdir('test') In [3]: ls -ls total 0 0 drwxr-xr-x 2 nata nata 68 Jan 23 18:58 test/
os.listdir#
Функция listdir возвращает список файлов и подкаталогов в указанном каталоге. Порядок файлов в списке произвольный, если нужно получить их в порядке сортировки имен, можно использовать sorted.
In [2]: os.listdir("09_functions") Out[2]: ['test_task_9_4.py', 'task_9_2a.py', 'task_9_1a.py', 'test_task_9_2.py', 'task_9_3a.py', 'test_task_9_3a.py', 'task_9_3.py', 'test_task_9_3.py', 'config_sw2.txt', 'test_task_9_2a.py', 'config_sw1.txt', 'test_task_9_1a.py', 'test_task_9_1.py', 'task_9_4.py', 'task_9_1.py', 'config_r1.txt', 'task_9_2.py'] In [3]: sorted(os.listdir("09_functions")) Out[3]: ['config_r1.txt', 'config_sw1.txt', 'config_sw2.txt', 'task_9_1.py', 'task_9_1a.py', 'task_9_2.py', 'task_9_2a.py', 'task_9_3.py', 'task_9_3a.py', 'task_9_4.py', 'test_task_9_1.py', 'test_task_9_1a.py', 'test_task_9_2.py', 'test_task_9_2a.py', 'test_task_9_3.py', 'test_task_9_3a.py', 'test_task_9_4.py']
Текущий каталог можно указать так "." или вызывать listdir без аргументов:
In [7]: os.listdir('.') Out[7]: ['cover3.png', 'dir2', 'dir3', 'README.txt', 'test'] In [7]: os.listdir() Out[7]: ['cover3.png', 'dir2', 'dir3', 'README.txt', 'test']
os.path#
Разные операционные системы (ОС) имеют разные соглашения об именах путей, поэтому в стандартной библиотеке есть несколько версий модуля os.path . Модуль os автоматически подгружает нужную часть для работы с текущей ОС. Например, при запуске одних и тех же функций модуля os на Windows и Linux, разделителем пути будут считаться разные значения.
При необходимости работы на Linux с путями Windows и наоборот, можно использовать модули posixpath , ntpath вместо os.path .
os.path.exists#
Функция os.path.exists проверяет существует ли указанный путь и возвращает True, если пусть существует и False иначе:
In [5]: os.path.exists('test') Out[5]: True In [6]: if not os.path.exists('test'): . : os.mkdir('test') . :
os.path.isdir, os.path.isfile#
Функция os.path.isdir возвращает True, если путь ведет к каталогу и False иначе:
In [4]: os.path.isdir("09_functions") Out[4]: True In [5]: os.path.isdir("/home/nata/repos/pyneng-tasks/exercises/09_functions/") Out[5]: True In [6]: os.path.isdir("/home/nata/repos/pyneng-tasks/exercises/09_functions/task_9_1.py") Out[6]: False In [7]: os.path.isdir("09_functions/task_9_1.py") Out[7]: False
Функция os.path.isfile возвращает True, если путь ведет к файлу и False иначе:
In [9]: os.path.isfile("09_functions/task_9_1.py") Out[9]: True In [10]: os.path.isfile("09_functions/") Out[10]: False
С помощью проверок os.path.isdir и os.path.isfile и os.listdir можно получить списки файлов и каталогов (в примере для текущего каталога).
Список каталогов в текущем каталоге:
In [8]: dirs = [d for d in os.listdir('.') if os.path.isdir(d)] In [9]: dirs Out[9]: ['dir2', 'dir3', 'test']
Список файлов в текущем каталоге:
In [10]: files = [f for f in os.listdir('.') if os.path.isfile(f)] In [11]: files Out[11]: ['cover3.png', 'README.txt']
os.path.split#
Функция os.path.split делает разделение пути на «основную часть» и конец пути по последнему / и возвращает кортеж из двух элементов. При этом для Windows автоматически будет использоваться обратный слеш.
Если в конце пути не слеша, разделение будет таким
In [6]: os.path.split("book/25_additional_info/README.md") Out[6]: ('book/25_additional_info', 'README.md') In [8]: os.path.split("book/25_additional_info") Out[8]: ('book', '25_additional_info')
Если путь заканчивается на слеш, второй элемент кортежа будет пустой строкой:
In [7]: os.path.split("book/25_additional_info/") Out[7]: ('book/25_additional_info', '') In [9]: os.path.split("book/") Out[9]: ('book', '')
Если в пути нет слеш, первый элемент кортежа будет пустой строкой:
In [39]: os.path.split("README.md") Out[39]: ('', 'README.md')
os.path.abspath#
Функция os.path.abspath возвращает абсолютный путь для указанного файла или каталога:
In [40]: os.path.abspath("09_functions") Out[40]: '/home/nata/repos/pyneng-tasks/exercises/09_functions' In [41]: os.path.abspath(".") Out[41]: '/home/nata/repos/pyneng-tasks/exercises'
Библиотека os
Модуль os из стандартной библиотеки языка программирования Python обычно используется для работы с установленной ОС, а также файловой системой ПК. Он содержит массу полезных методов для взаимодействия с файлами и папками на жестком диске. Программы, работающие с модулем os, не зависят от типа ОС и являются легко переносимыми на другую платформу.
Что такое модуль os?
Модуль os в Python — это библиотека функций для работы с операционной системой. Методы, включенные в неё позволяют определять тип операционной системы, получать доступ к переменным окружения, управлять директориями и файлами:
- проверка существования объекта по заданному пути;
- определение размера в байтах;
- удаление;
- переименование и др.
При вызове функций os необходимо учитывать, что некоторые из них могут не поддерживаться текущей ОС.
Чтобы пользоваться методами из os, нужно подключить библиотеку. Для этого в Python используется import os, который необходимо описать в файле до первого обращения к модулю.
Рекомендуется использовать эту инструкцию в начале файла с исходным кодом.
Функции модуля os
Методы из библиотеки os могут применяться пользователем для разных целей. Ниже показаны наиболее популярные из них, позволяющие получать данные о операционной системе. Также получать сведения о файлах и папках, хранимых в памяти на жестком диске ПК.
Получение информации об ОС
Чтобы узнать имя текущей ОС, достаточно воспользоваться методом name. В зависимости от установленной платформы, он вернет ее короткое наименование в строковом представлении. Следующая программа была запущена на ПК с ОС Windows 10, поэтому результатом работы функции name является строка nt. Увидеть это можно при помощи обычного метода print.
import os print(os.name) nt
Получить сведения, которые касаются конфигурации компьютера, можно при помощи метода environ. Вызвав его через обращение к библиотеке os, пользователь получает большой словарь с переменными окружения, который выводится в консоль или строковую переменную. Таким образом, можно узнать название системного диска, адрес домашней директории, имя системы и массу другой информации. Следующий пример демонстрирует применение environ.
import os print(os.environ) environ()
При помощи функции getenv можно получить доступ к различным переменным среды. Чтобы сделать это, достаточно передать в качестве аргумента необходимое название переменной, как в следующем примере, где print выводит на экран сведения о TMP на дисплей в консоль.
import os print(os.getenv("TMP")) C:\Users\admin\AppData\Local\Temp
Изменение рабочей директории
По умолчанию рабочей директорией программы является каталог, где содержится документ с ее исходным кодом. Благодаря этому, можно не указывать абсолютный путь к файлу, если тот находится именно в этой папке. Получить сведения о текущей директории позволяет функция getcwd, которая возвращает полный адрес рабочего каталога на жестком диске. В следующем фрагменте кода показано что будет, если передать результат работы этого метода в print. Как можно заметить, рабочей директорией является каталог program на системном диске C.
import os print(os.getcwd()) C:\Users\admin\source\repos\program
При желании, рабочую директорию можно настроить по своему усмотрению, применив метод chdir из библиотеки os. Для этого необходимо передать ему в качестве параметра абсолютный адрес к новому каталогу. Если указанного пути на самом деле не существует, программа будет завершена в аварийном режиме из-за выброшенного исключения. В следующем примере кода продемонстрирован переход к новой рабочей директории под названием folder на диске D.
import os os.chdir(r"D:\folder") D:\folder
Проверка существования пути
Чтобы избежать ошибок, связанных с отсутствием определенного файла или директории, которые должны быть обработаны программой, следует предварительно проверять их наличие с помощью метода exists. Передав ему в качестве аргумента путь к нужному файлу или папке, можно рассчитывать на лаконичный ответ в виде булевого значения true/false, сообщающего о наличии/отсутствии указанного объекта в памяти компьютера. В следующем примере идет проверка текстового файла test.txt из корневого каталога D, которая возвращает True.
import os print(os.path.exists("D:/test.txt")) True
Если объект на диске реально существует, это не всегда значит, что он имеет подходящую для дальнейшей обработки форму. Проверить, является ли определенный объект файлом, поможет функция isfile, которая принимает его адрес. Ознакомиться с результатом его работы можно из следующего примера, где print отображает на экране значение True для файла test.txt.
import os print(os.path.isfile("D:/test.txt")) True
Аналогичные действия можно выполнить и для проверки объекта на принадлежность к классу директорий, вызвав для его адреса метод isdir из библиотеки os. Как можно заметить, в данном случае print выводит на экран булево значение False, поскольку test.txt не является папкой.
import os print(os.path.isdir("D:/test.txt")) False
Создание директорий
Возможности модуля os позволяют не только отображать информацию об уже существующих в памяти объектах, но и генерировать абсолютно новые. Например, с помощью метода mkdir довольно легко создать папку, просто указав для нее желаемый путь. В следующем примере в корневом каталоге диска D производится новая папка под названием folder через mkdir.
import os os.mkdir(r"D:\folder")
Однако на этом возможности по генерации директорий не заканчиваются. Благодаря функции makedirs можно создавать сразу несколько новых папок в неограниченном количестве, если предыдущая директория является родительской для следующей. Таким образом, в следующем примере показывается генерация целой цепочки папок из folder, first, second и third.
import os os.makedirs(r"D:\folder\first\second\third")
Удаление файлов и директорий
Избавиться от ненужного в дальнейшей работе файла можно с помощью метода remove, отдав ему в качестве аргумента абсолютный либо относительный путь к объекту. В небольшом коде ниже демонстрируется удаление документа test.txt из корневой директории диска D на ПК.
import os os.remove(r"D:\test.txt")
Чтобы стереть из памяти папку, следует воспользоваться встроенной функцией rmdir, указав ей адрес объекта. Однако здесь присутствуют определенные нюансы, поскольку программа не позволит беспрепятственно удалить директорию, в которой хранятся другие объекты. В таком случае на экране отобразится ошибка и будет выброшено исключение. В следующем примере производится процедура удаления пустой директории folder при помощи метода rmdir.
import os os.rmdir(r"D:\folder")
Для быстрого удаления множества пустых папок следует вызывать функцию removedirs. Она предоставляет возможность избавиться сразу от нескольких каталогов на диске, при условии, что все они вложены друг в друга. Таким образом, указав путь к конечной папке, можно легко удалить все родительские директории, но только если они в результате оказываются пустыми. В примере показано мгновенное удаление четырех разных папок: folder, first, second, third.
import os os.removedirs(r"D:\folder\first\second\third")
Запуск на исполнение
Встроенные функции библиотеки os позволяют запускать отдельные файлы и папки прямиком из программы. С этой задачей прекрасно справляется метод startfile, которому стоит передать адрес необходимо объекта. Программное обеспечение, используемое для открытия документа, определяется средой автоматически. Например, при запуске обычного файла test.txt, как это сделано в следующем примере, задействуется стандартный блокнот. Если передать функции ссылку на директорию, она будет открыта при помощи встроенного менеджера файлов.
import os os.startfile(r"D:\test.txt")
Получение имени файла и директории
Иногда для взаимодействия с документом необходимо получить его полное имя, включающее разрешение, но не абсолютный путь к нему на диске. Преобразовать адрес объекта в название позволяет функция basename, которая содержится в подмодуле path из библиотеки os. Таким образом, следующий пример показывает преобразование пути test.txt в простое имя файла.
import os print(os.path.basename("D:/test.txt")) test.txt
Обратная ситуация возникает тогда, когда пользователю нужно получить только путь к файлу, без самого названия объекта. Это поможет сделать метод dirname, который возвращает путь к заданному документу в строковом представлении, как это продемонстрировано в небольшом примере ниже. Здесь print выводит на экран адрес текстового документа в папке folder.
import os print(os.path.dirname("D:/folder/test.txt")) D:/folder
Вычисление размера
Чтобы определить размер документа или папки, стоит воспользоваться функцией getsize, как это показано в следующем примере для файла test.txt. Функция print выводит размер данного документа в байтах. Воспользоваться getsize можно и для измерения объема директорий.
import os print(os.path.getsize("D:\\test.txt")) 136226
Переименование
Библиотека os предоставляет возможность быстрой смены названия для любого файла или же каталога при помощи метода rename. Данная функция принимает сразу два разных аргумента. Первый отвечает за путь к старому наименованию документа, в то время как второй отвечает за его новое название. В примере показано переименование директории folder в catalog. Стоит помнить, что метод может генерировать исключение, если по указанному пути нет файла.
import os os.rename(r"D:\folder", r"D:\catalog")
Переименовывать можно не только один каталог, но и несколько папок сразу, только если все они находятся в одной иерархической цепочке. Для этого достаточно вызвать метод renames и передать ему путь к конечной директории в качестве первого аргумента. В роли же второго параметра выступает аналогичный адрес к папке, но только с новыми именами всей цепочки. Следующий пример демонстрирует правильное использование функции renames, за счет чего было произведено переименование директорий folder, first и second в catalog, one и two.
import os os.renames(r"D:\folder\first\second", r"D:\catalog\one\two")
Содержимое директорий
Проверить наличие в каталоге определенных объектов позволяет функция listdir. С её помощью можно получить информацию о файлах и папках в виде списка. В программе немного ниже показано, как метод принимает в качестве параметра путь к каталогу folder на диске D, а затем выводит название внутренней папки first и документа test.txt, вывод в консоль осуществляется с помощью print.
import os print(os.listdir(r"D:\folder")) ['first', 'test.txt']
Воспользовавшись методом walk, можно получить доступ к названиям и путям всех подпапок и файлов, относящихся к заданному каталогу. Применив один внешний цикл for, а также два вложенных, несложно получить информацию об объектах в каталоге folder через специальные списки directories и files. Сведения выдаются с помощью многократного обращения к print.
import os for root, directories, files in os.walk(r"D:\folder"): print(root) for directory in directories: print(directory) for file in files: print(file) D:\folder first D:\folder\first second D:\folder\first\second third D:\folder\first\second\third test.txt
Информация о файлах и директориях
Вывести на экран или в любое другое место основные сведения об объекте можно через метод stat. Поместив ему в качестве параметра расположение файла или папки на диске компьютера, стоит ожидать небольшой массив информации. Здесь можно найти данные о размере объекта в байтах, а также некие числовые значения, отображающие доступ и режим его работы.
import os print(os.stat(r"D:\test.txt")) os.stat_result(st_mode=33206, …)
Обработка путей
Возвращаясь к классу path из библиотеки os, стоит принять во внимание функцию split, позволяющую очень легко разъединять путь к файлу и имя файла в различные строки. Это демонстрируется на следующем примере с текстовым документом test.txt в папке folder.
import os print(os.path.split(r"D:\folder\test.txt")) ('D:\\folder', 'test.txt')
Обратное действие выполняет функция join, позволяя легко соединить путь к документу с его названием. Как видно из результатов работы данного кода, благодаря print на экране будет отображаться путь, который ссылается на текстовый файл test.txt в каталоге folder на D.
import os print(os.path.join(r"D:\folder", "test.txt")) D:\folder\test.txt
Это были базовые возможности модуля os, реализуемые в программах на языке Python за счет множества встроенных методов по управлению установленной ОС. Таким образом, они дают возможность не только получать полезные сведения о платформе, но и работать с содержимым диска, создавая новые директории и файлы, переименовывая и полностью удаляя их.
Работа с файлами в Python с помощью модуля OS
Обработка файлов в Python с помощью модуля os включает создание, переименование, перемещение, удаление файлов и папок, а также получение списка всех файлов и каталогов и многое другое.
В индустрии программного обеспечения большинство программ тем или иным образом обрабатывают файлы: создают их, переименовывают, перемещают и так далее. Любой программист должен обладать таким навыком. С этим руководством вы научитесь использовать модуль os в Python для проведения операций над файлами и каталогами вне зависимости от используемой операционной системы.
Важно знать, что модуль os используется не только для работы с файлами. Он включает массу методов и инструментов для других операций: обработки переменных среды, управления системными процессами, а также аргументы командной строки и даже расширенные атрибуты файлов, которые есть только в Linux.
Модуль встроенный, поэтому для работы с ним не нужно ничего устанавливать.
Вывод текущей директории
Для получения текущего рабочего каталога используется os.getcwd() :
import os # вывести текущую директорию print("Текущая деректория:", os.getcwd())
os.getcwd() возвращает строку в Юникоде, представляющую текущий рабочий каталог. Вот пример вывода:
Текущая деректория: C:\python3\bin
Создание папки
Для создания папки/каталога в любой операционной системе нужна следующая команда:
# создать пустой каталог (папку) os.mkdir("folder")
После ее выполнения в текущем рабочем каталоге тут же появится новая папка с названием «folder».
Если запустить ее еще раз, будет вызвана ошибка FileExistsError , потому что такая папка уже есть. Для решения проблемы нужно запускать команду только в том случае, если каталога с таким же именем нет. Этого можно добиться следующим образом:
# повторный запуск mkdir с тем же именем вызывает FileExistsError, # вместо этого запустите: if not os.path.isdir("folder"): os.mkdir("folder")
Функция os.path.isdir() вернет True , если переданное имя ссылается на существующий каталог.
Изменение директории
Менять директории довольно просто. Проделаем это с только что созданным:
# изменение текущего каталога на 'folder' os.chdir("folder")
Еще раз выведем рабочий каталог:
# вывод текущей папки print("Текущая директория изменилась на folder:", os.getcwd())
Текущая директория изменилась на folder: C:\python3\bin\folder
Создание вложенных папок
Предположим, вы хотите создать не только одну папку, но и несколько вложенных:
# вернуться в предыдущую директорию os.chdir("..") # сделать несколько вложенных папок os.makedirs("nested1/nested2/nested3")
Это создаст три папки рекурсивно, как показано на следующем изображении:
Создание файлов
Для создания файлов в Python модули не нужны. Можно использовать встроенную функцию open() . Она принимает название файла, который необходимо создать в качестве первого параметра и желаемый режим открытия — как второй:
# создать новый текстовый файл text_file = open("text.txt", "w") # запить текста в этот файл text_file.write("Это текстовый файл")
w значит write (запись), a — это appending (добавление данных к уже существующему файлу), а r — reading (чтение). Больше о режимах открытия можно почитать здесь.
Переименование файлов
С помощью модуля os достаточно просто переименовать файл. Поменяем название созданного в прошлом шаге.
# переименовать text.txt на renamed-text.txt os.rename("text.txt", "renamed-text.txt")
Функция os.rename() принимает 2 аргумента: имя файла или папки, которые нужно переименовать и новое имя.
Перемещение файлов
Функцию os.replace() можно использовать для перемещения файлов или каталогов:
# заменить (переместить) этот файл в другой каталог os.replace("renamed-text.txt", "folder/renamed-text.txt")
Стоит обратить внимание, что это перезапишет путь, поэтому если в папке folder уже есть файл с таким же именем ( renamed-text.txt ), он будет перезаписан.
Список файлов и директорий
# распечатать все файлы и папки в текущем каталоге print("Все папки и файлы:", os.listdir())
Функция os.listdir() возвращает список, который содержит имена файлов в папке. Если в качестве аргумента не указывать ничего, вернется список файлов и папок текущего рабочего каталога:
Все папки и файлы: ['folder', 'handling-files', 'nested1', 'text.txt']
А что если нужно узнать состав и этих папок тоже? Для этого нужно использовать функцию os.walk() :
# распечатать все файлы и папки рекурсивно for dirpath, dirnames, filenames in os.walk("."): # перебрать каталоги for dirname in dirnames: print("Каталог:", os.path.join(dirpath, dirname)) # перебрать файлы for filename in filenames: print("Файл:", os.path.join(dirpath, filename))
os.walk() — это генератор дерева каталогов. Он будет перебирать все переданные составляющие. Здесь в качестве аргумента передано значение «.», которое обозначает верхушку дерева:
Каталог: .\folder Каталог: .\handling-files Каталог: .\nested1 Файл: .\text.txt Файл: .\handling-files\listing_files.py Файл: .\handling-files\README.md Каталог: .\nested1\nested2 Каталог: .\nested1\nested2\nested3
Метод os.path.join() был использован для объединения текущего пути с именем файла/папки.
Удаление файлов
Удалим созданный файл:
# удалить этот файл os.remove("folder/renamed-text.txt")
os.remove() удалит файл с указанным именем (не каталог).
Удаление директорий
С помощью функции os.rmdir() можно удалить указанную папку:
# удалить папку os.rmdir("folder")
Для удаления каталогов рекурсивно необходимо использовать os.removedirs() :
# удалить вложенные папки os.removedirs("nested1/nested2/nested3")
Это удалит только пустые каталоги.
Получение информации о файлах
Для получения информации о файле в ОС используется функция os.stat() , которая выполняет системный вызов stat() по выбранному пути:
open("text.txt", "w").write("Это текстовый файл") # вывести некоторые данные о файле print(os.stat("text.txt"))
os.stat_result(st_mode=33206, st_ino=14355223812608232, st_dev=1558443184, st_nlink=1, st_uid=0, st_gid=0, st_size=19, st_atime=1575967618, st_mtime=1575967618, st_ctime=1575966941)
Это вернет кортеж с отдельными метриками. В их числе есть следующие:
-
- st_size — размер файла в байтах
- st_atime — время последнего доступа в секундах (временная метка)
- st_mtime — время последнего изменения
- st_ctime — в Windows это время создания файла, а в Linux — последнего изменения метаданных
Для получения конкретного атрибута нужно писать следующим образом:
# например, получить размер файла print("Размер файла:", os.stat("text.txt").st_size)
Размер файла: 19
На этой странице больше об атрибутах.
Выводы
Работать с файлами и каталогами в Python очень просто. Не имеет значения даже используемая операционная система, хотя отдельные уникальные для системы функции можно использовать: например, os.chown() или os.chmod() в Linux. Более подробно эта тема освещена в официальной документации Python.