Модуль os в Python — взаимодействие с операционной системой
Модуль os позволяет взаимодействовать с операционной системой — узнавать/менять файловую структуру, переменные среды, узнавать имя и права пользователя и др. Программа, использующая переменные и функции модуля os, переносима с одной операционной системы на другую, так как os умеет учитывать особенности каждой ОС. Однако ряд функций используется только для Windows или Unix-подобных ОС.
Следует отметить, что часть функциональности os реализуют другие модули и встроенные функции Python. В этом случае нередко лучше выбирать их. Например, функция os.access() проверяет наличие доступа к файлу. Если файл открывается на чтение или запись, проще использовать функцию open(), а в случае запрета на доступ обработать возникшее исключение PermissionError.
Ниже в качестве примера приводятся некоторые функции модуля os для работы с файловой системой.
Узнать текущий каталог:
>>> os.getcwd() '/home/pl/Documents/python'
Смена текущего каталога:
>>> os.chdir('/home') >>> os.getcwd() '/home' >>> os.chdir('./pl/Documents/python') >>> os.getcwd() '/home/pl/Documents/python'
Создать каталог:
>>> os.mkdir('TEXT')
Создать дерево каталогов:
>>> os.makedirs('ONE/TWO/THREE') >>> os.listdir('ONE') ['TWO'] >>> os.listdir('ONE/TWO') ['THREE']
Список содержимого каталога (нерекурсивный):
>>> os.listdir() ['text4.txt', 'text1.txt', 'text3.txt', 'try_except.py', 'files.py', 'text5.txt', 'grades_oop.py', 'grades.py', 'text6.txt', 'text2.txt', 'text.txt', 'TEXT'] >>> os.listdir('/home') ['pl']
В отличие от listdir() функция scandir() возвращает итератор, который генерирует объекты типа os.DirEntry, имеющие атрибуты и методы, с помощью которых можно получить информацию о файле или каталоге.
>>> list(os.scandir('test')) [<DirEntry 'Saved'>, <DirEntry 'flag.png'>] >>> for i in os.scandir('test'): ... print(i.name, i.path, i.is_dir(), i.is_file()) ... print(i.stat()) ... Saved test/Saved True False os.stat_result(st_mode=16893, st_ino=4309400, st_dev=66308, st_nlink=2, st_uid=1000, st_gid=1000, st_size=4096, st_atime=1652852331, st_mtime=1652852329, st_ctime=1652852491) flag.png test/flag.png False True os.stat_result(st_mode=33279, st_ino=4259361, st_dev=66308, st_nlink=1, st_uid=1000, st_gid=1000, st_size=11039, st_atime=1652852289, st_mtime=1560647773, st_ctime=1652852289)
Обе функции (listdir() и scandir()) "не заходят" во вложенные каталоги. Для обхода дерева каталогов используется функция os.walk(). О том, как она работает, есть отдельная статья.
Сведения о файле|каталоге:
>>> os.stat('/home') posix.stat_result(st_mode=16877, st_ino=1048577, st_dev=2053, st_nlink=3, st_uid=0, st_gid=0, st_size=4096, st_atime=1344368518, st_mtime=1339316982, st_ctime=1339316982) >>> os.stat('text.txt') posix.stat_result(st_mode=33188, st_ino=1575740, st_dev=2053, st_nlink=1, st_uid=1000, st_gid=1000, st_size=41, st_atime=1344124896, st_mtime=1343895362, st_ctime=1343895362) >>> s = os.stat('test.c') >>> s.st_size 67
Переименовать файл|каталог:
>>> os.rename('text2.txt', 'xett.txt') >>> os.rename('TEXT', 'ETXT')
Удаление каталога:
>>> os.rmdir('ETXT')
Удалить можно только пустую директорию. Это же касается удаления дерева каталогов с помощью функции os.removedirs(). Корневой каталог (который передается в функцию) и все вложенные в него не должны содержать файлов.
Для удаления файла используется функция os.remove().
>>> os.mkdir('ABC') >>> os.replace('test.pas', 'ABC/test.txt') >>> os.listdir('ABC') ['test.txt'] >>> os.remove('ABC/test.txt') >>> os.listdir('ABC') []
В примере выше используется функция os.replace(), с помощью которой можно переместить и одновременно переименовать файл или каталог.
Модуль os следует предпочесть при работе с индивидуальными файлами, для работы с группой файлов больше подходит модуль shutil, который позволяет выполнять операции над деревьями данных.
Скопировать дерево:
>>> shutil.copytree('../python', '../copy-python') >>> os.listdir('../copy-python') ['text4.txt', 'text1.txt', 'text3.txt', 'try_except.py', 'ONE', 'files.py', 'xett.txt', 'text5.txt', 'grades_oop.py', 'grades.py', 'text6.txt', 'text.txt']
Перемещение|переименование дерева:
>>> shutil.move('../copy-python', 'python-copy')
Удаление дерева:
>>> shutil.rmtree('python-copy')
Объект os.environ похож на словарь, содержит большой объем данных. В нем перечисляются переменные среды и их значения.
>>> os.environ environ({'SHELL': '/bin/bash', ... ... , '_': '/usr/bin/python3'})
По ключу, то есть имени переменной среды, можно получить ее значение:
>>> os.environ['USER'] 'pl' >>> os.environ['PATH'] '/usr/local/sbin:/usr/local/bin ... :/snap/bin'
Также для получения значений переменных среды можно использовать функцию getenv():
>>> os.getenv('HOME') '/home/pl' >>> os.getenv('_') '/usr/bin/python3'