Данный модуль можно применять во многих случаях. В данном разделе мы не рассмотрим каждый из них. Вместо этого, мы рассмотрим, как именно его можно применять, а также ознакомимся с подмодулем, под названием os.path. В частности, мы расскажем о:
- os.name
- os.environ
- os.chdir()
- os.getcwd()
- os.getenv()
- os.putenv()
- os.mkdir()
- os.makedirs()
- os.remove()
- os.rename()
- os.rmdir()
- os.startfile()
- os.walk()
- os.path
Это может выглядеть как большой объем материала, но есть еще минимум десяток других задач, которые модуль os может выполнять. Так что данный раздел можно назвать кратким экскурсом. Для использования любого из методов, упомянутых в данном разделе, вам нужно импортировать модуль os, вот так:
1 |
import os |
Итак, приступим!
os.name
Модуль os обладает как вызываемыми функциями, так и обычными значениями. В случае с os.name, речь идет только о значениях. При доступе к os.name, вы получите информацию о том, с какой платформой вы работаете. Вам откроются следующие значения: ‘posix’, ‘nt’, ‘os2’, ‘ce’, ‘java’, ‘riscos’. Давайте посмотрим на то, что выйдет, если запустить его на Windows 7:
1 2 3 |
import os print(os.name) # ответ: nt |
Это говорит нам о том, что наш экземпляр Пайтон работает в окне Windows. Как мы об этом узнали? Майкрософт начали называть свою операционную систему NT много лет назад. Например, Windows 7 также носит имя Windows NT 6.1.
os.environ, os.getenv() и os.putenv()
Значение os.environ известно как объект мэппинга (сопоставления), который работает со словарем переменных пользовательской среды. Возможно вы не знали, но каждый раз, когда вы пользуетесь своим компьютером, некоторые переменные среды уже установлены.
Это дает вам полезную информацию, такую как количество процессоров, тип ОЗУ, имя компьютера, и так далее. Посмотрим, что мы сможем узнать о нашем компьютере:
1 2 |
import os print(os.environ) |
Ответ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
{'ALLUSERSPROFILE': 'C:\\ProgramData', 'APPDATA': 'C:\\Users\\mike\\AppData\\Roaming', 'CLASSPATH': '.;C:\\Program Files\\QuickTime\\QTSystem\\QTJava.zip', 'COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files', 'COMPUTERNAME': 'MIKE-PC', 'COMSPEC': 'C:\\Windows\\system32\\cmd.exe', 'FP_NO_HOST_CHECK': 'NO', 'HOMEDRIVE': 'C:', 'HOMEPATH': '\\Users\\mike', 'LOCALAPPDATA': 'C:\\Users\\mike\\AppData\\Local', 'LOGONSERVER': '\\\\MIKE-PC', 'NUMBER_OF_PROCESSORS': '2', 'OS': 'Windows_NT', 'PATHEXT': '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC', 'PROCESSOR_ARCHITECTURE': 'x86', 'PROCESSOR_IDENTIFIER': 'x86 Family 6 Model 15 Stepping 13, GenuineIntel', 'PROCESSOR_LEVEL': '6', 'PROGRAMDATA': 'C:\\ProgramData', 'PROGRAMFILES': 'C:\\Program Files', 'PSMODULEPATH': 'C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\Modules\\', 'PUBLIC': 'C:\\Users\\Public', 'PYTHONIOENCODING': 'cp437', 'QTJAVA': 'C:\\Program Files\\QuickTime\\QTSystem\\QTJava.zip', 'SESSIONNAME': 'Console', 'SYSTEMDRIVE': 'C:', 'SYSTEMROOT': 'C:\\Windows', 'TEMP': 'C:\\Users\\mike\\AppData\\Local\\Temp', 'TMP': 'C:\\Users\\mike\\AppData\\Local\\Temp', 'USERDOMAIN': 'mike-PC', 'USERNAME': 'mike', 'USERPROFILE': 'C:\\Users\\mike', 'VBOX_INSTALL_PATH': 'C:\\Program Files\\Oracle\\VirtualBox\\', 'VS90COMNTOOLS': 'C:\\Program Files\\Microsoft Visual Studio 9.0\\Common7\\Tool\s\\', 'WINDIR': 'C:\\Windows', 'WINDOWS_TRACING_FLAGS': '3', 'WINDOWS_TRACING_LOGFILE': 'C:\\BVTBin\\Tests\\installpackage\\csilogfile.log', 'WINGDB_ACTIVE': '1', 'WINGDB_PYTHON': 'c:\\python27\\python.exe', 'WINGDB_SPAWNCOOKIE': 'rvlxwsGdD7SHYIJm'} |
Ваши данные будут отличаться от моих, так как конфигурация компьютера у всех немного отличается, однако вы определенно увидите большое количество совпадений. Как вы могли заметить, это вернуло словарь. Это значит, что вы можете получить доступ к значениям среды, пользуясь обычными словарными методами. Например:
1 2 3 |
import os print(os.environ["TMP"]) # C:\\Users\\mike\\AppData\\Local\\Temp |
Вы также можете использовать функцию os.getenv для доступа к этой переменной:
1 2 3 |
import os print(os.getenv("TMP")) # C:\\Users\\mike\\AppData\\Local\\Temp |
Полезность использования os.getenv() вместо словаря os.environ заключается в том, что если вы находитесь в положении, когда вам нужно получить доступ к переменной среды, которая не существует, функция getenv попросту ничего не сделает. Если вы попытаетесь сделать то же самое, пользуясь os.environ, вы получите уведомление об ошибке. Давайте попробуем на примере:
1 2 3 |
import os print(os.environ["TMP2"]) |
Результат выполнения данного скрипта:
1 2 3 4 5 6 |
Traceback (most recent call last): File "<pyshell#1>", line 1, in <module> os.environ["TMP2"] File "C:\Python27\lib\os.py", line 423, in __getitem__ return self.data[key.upper()] KeyError: 'TMP2' |
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
os.chdir() и os.getcwd()
Функция os.chdir позволяет нам вносить изменения в каталоге, который мы в данный момент используем в сессии. Если вам нужно знать, какой путь вы в данный момент используете, для этой нужно вызвать os.getcwd(). Попробуем воспользоваться обоими модулями:
1 2 3 4 5 6 |
import os print(os.getcwd()) # C:\\Python27 os.chdir(r"C:\Users\mike\Documents") print(os.getcwd()) # C:\\Users\\mike\\Documents |
Указанный код демонстрирует нам, что мы открыли директорию по умолчанию в Пайтоне, после запуска данного кода в IDLE. После этого мы изменили папки, при помощи os.chdir(). Наконец, мы вызывали os.getcwd() еще раз, чтобы убедиться, что все изменения были выполнены правильно.
os.mkdir() и os.makedirs()
Как вы могли догадаться, эти два метода используются для создания папок. Первая, os.mkdir(), позволяет создать одну папку. Попробуем:
1 2 3 4 5 |
import os os.mkdir("test") path = r'C:\Users\mike\Documents\pytest' os.mkdir(path) |
Первая строка кода создает папку под названием test в определенном каталоге. Вы можете использовать эти модули в предыдущем разделе, чтобы узнать, где именно вы запустили свой код, на случай, если вы забыли. Во втором примере мы назначили путь к переменной, затем к os.mkdir(). Это позволяет вам создать папку в любой точке вашей системы, где есть доступ. Функция os.makedirs() создает промежуточные папки в пути, если их там нет. В целом, это значит, что вы создали путь, в котором размещены папки. Лично я часто прибегал к данному решению, когда была необходимость создания журнала, с датированной структурой, например Год\Месяц\День. Давайте взглянем на пример:
1 2 3 4 |
import os path = r'C:\Users\mike\Documents\pytest\2014\02\19' os.makedirs(path) |
Что произошло? Этот код просто создал кучу папок! Если в вашей системе все еще есть папка pytest, то в ней появится папка 2014, в которой также есть папка, в которой, удивительно, находится еще одна. Попробуйте сами, воспользовавшись рабочим путем в вашей системе.
os.remove() и os.rmdir()
Функции os.remove() и os.rmdir() используются для удаления файлов и каталогов соответственно. Посмотрим на os.remove():
1 2 3 |
import os os.remove("test.txt") |
Этот фрагмент кода пытается удалить файл под названием test.txt из вашего рабочего каталога. Если модуль не может найти файл, должно появиться уведомление о той или иной ошибке. Ошибка также возникнет, если файл уже используется (другими словами закрыт), или у вас нет разрешения для удаления данного файла. Возможно, вы хотите проверить os.unlink, который выполняет ту же функцию. Термин unlink – привычное для Unix название данной процедуры. Взглянем на пример работы os.rmdir():
1 2 3 |
import os os.rmdir("pytest") |
Данный код попытается удалить каталог под названием pytest из каталога, используемого в данный момент в работе. В случае, если это удалось, каталог pytest исчезнет. Ошибка может возникнуть, если каталога с таким названием не существует, если у вас нет разрешения на его удаление, или если каталог не пустой. Вам возможно хочется взглянуть на os.removedirs(), который может удалить пустые вложенные каталоги.
os.rename(src, dst)
Функция os.rename() применяется тогда, когда нужно переименовать файл или папку. Посмотрим на примере:
1 |
os.rename("test.txt", "pytest.txt") |
В этом примере, мы указали os.rename на то, что нужно переименовать файл под названием test.txt на pytest.txt. Это произойдет в каталоге, с которым мы в данный момент работаем. Ошибка может возникнуть в том случае, если вы попытаетесь переименовать несуществующий файл, или если у вас нет доступа к данной операции. Также существует функция os.renames, которая меняет название папки или файла соответственно.
os.startfile()
Метод os.startfile() позволяет нам «запустить» файл в привязанной к нему программе. Другими словами, мы можем открыть файл вместе с привязанной к нему программой, как когда вы открываете файл PDF двойным щелчком, и он открывается в программе Adobe Reader. Попробуем:
1 2 3 |
import os os.startfile(r'C:\Users\mike\Documents\labels.pdf') |
В данном примере мы прошли полный путь к модулю os.startfile, который указывает на открытие файла под названием labels.pdf. На моем компьютере данная функция открывает файл PDF в программе Adobe Reader. Попробуйте открыть файлы PDF, MP3 или фотографии на своем компьютере при помощи данного метода, чтобы увидеть как он работает.
os.walk()
Метод os.walk() дает нам возможность для итерации на корневом уровне пути. Это значит, что мы можем назначить путь к этой функции и получить доступ ко всем её подкаталогам и файлам. Используем одну из папок Пайтон, при помощи которой мы можем проверить данную функцию. Мы используем C:\Python27\Tools
1 2 3 4 5 6 |
import os path = r'C:\Python27\Tools' for root, dirs, files in os.walk(path): print(root) |
Результат работы:
1 2 3 4 5 6 7 |
C:\Python27\Tools C:\Python27\Tools\i18n C:\Python27\Tools\pynche C:\Python27\Tools\pynche\X C:\Python27\Tools\Scripts C:\Python27\Tools\versioncheck C:\Python27\Tools\webchecker |
Мы можем отобразить и весь список каталогов и файлов.
1 2 3 4 5 6 7 8 9 |
import os for root, dirs, files in os.walk(path): print(root) for _dir in dirs: print(_dir) for _file in files: print(_file) |
Эта часть кода покажет нам весьма большой объем, так что не будем демонстрировать всю выдачу, вы можете ознакомиться с содержимым сами. Поздравляем, теперь мы готовы к тому, чтобы научиться работать с путями!
os.path
Подмодуль os.path модуля os имеет широкий ряд встроенных преимуществ. Ознакомимся со следующими функциями:
- basename
- dirname
- exists
- isdir and isfile
- join
- split
Это не все функции подмодуля. С ними мы можем ознакомиться позже.
os.path.basename
Функция basename вернет название файла пути. Пример:
1 2 3 4 |
import os os.path.basename(r'C:\Python27\Tools\pynche\ChipViewer.py') # ChipViewer.py |
Это очень полезная функция, особенно в тех случаях, когда нужно использовать имя файла для наименования того или иного связанного с работой файла, например лог-файл. Такая ситуация возникает часто при работе с файлами данных.
Недорогие и качественные просмотры в Телеграм доступны на сайте ДокторСмм с оптовыми скидками и персональными предложениями. Здесь Вам удастся подобрать, как наиболее привлекательный формат ресурса, так и самую оптимальную скорость поступления, доходящую до 1000 единиц в сутки. При этом Вы можете покупать просмотры, как к конкретному посту, так и ко всей ленте в целом.
os.path.dirname
Функция dirname возвращает только часть каталога пути. Это проще понять, если мы взглянем на пример кода:
1 2 3 4 |
import os print( os.path.dirname(r'C:\Python27\Tools\pynche\ChipViewer.py') ) # C:\\Python27\\Tools\\pynche |
В данном примере мы просто возвращаем путь к каталогу. Это также полезно, когда вам нужно сохранить другие файлы рядом с тем, который вы обрабатываете в данный момент. Как и в случае с лог-файлом, упомянутым выше.
os.path.exists
Функция exists говорит нам, существует ли файл, или нет. Все что вам нужно, это указать ему путь. Взглянем на пример:
1 2 3 4 5 |
import os os.path.exists(r'C:\Python27\Tools\pynche\ChipViewer.py') # True os.path.exists(r'C:\Python27\Tools\pynche\fake.py') # False |
В первом примере, мы указали функции exists настоящий путь, на что она указывает как True. Это говорит о том, что данный путь существует. Во втором примере, мы указали неправильный путь, от чего функция указывает нам на это сообщением False.
os.path.isdir / os.path.isfile
Методы isdir и isfile тесно связаны с методом exists, так как они также тестируют присутствие или отсутствие файлов или папок на тех или иных путях. Однако, isdir проверяет только пути к папкам, а isfile, соответственно, к файлам. Если вам нужно проверить путь, и не важно, папка это или файл, проще будет воспользоваться методом exists. В любом случае, взглянем на пару примеров:
1 2 3 4 5 6 7 8 9 |
import os os.path.isfile(r'C:\Python27\Tools\pynche\ChipViewer.py') # True os.path.isdir(r'C:\Python27\Tools\pynche\ChipViewer.py') # False os.path.isdir(r'C:\Python27\Tools\pynche') # True os.path.isfile(r'C:\Python27\Tools\pynche') # False |
Уделите особое внимание данным примерам. В первом мы указали путь к файлу и проверили, является ли этот путь в действительности файлом. Затем, во втором примере, мы проделали то же самое, но в контексте папки. Вы можете лично ознакомиться с результатами. После этих двух примеров, мы немного изменили условия, указав путь к папке для обеих функций. Эти примеры наглядно демонстрируют то, как эти функции работают.
os.path.join
Метод join позволяет вам совместить несколько путей при помощи присвоенного разделителя. К примеру, в Windows, в роли разделителя выступает бэкслэш (косая черта, указывающая назад), однако в Linux функция разделителя присвоена косой черте, указывающей вперед (forward slash). Как это работает:
1 2 3 4 |
import os print( os.path.join(r'C:\Python27\Tools\pynche', 'ChipViewer.py') ) # C:\\Python27\\Tools\\pynche\\ChipViewer.py |
В данном примере мы совместили путь каталога и файла вместе, для получения рабочего пути. Обратите внимание на то, что метод join не указывает на то, какой результат в итоге вышел.
os.path.split
Метод split разъединяет путь на кортеж, который содержит и файл и каталог. Взглянем на пример:
1 2 3 4 |
import os print( os.path.split(r'C:\Python27\Tools\pynche\ChipViewer.py') ) # ('C:\\Python27\\Tools\\pynche', 'ChipViewer.py') |
В данном примере показано, что происходит, когда мы указываем путь к файлу. Теперь взглянем на то, что происходит, если в конце пути нет названия файла:
1 2 3 4 |
import os print( os.path.split(r'C:\Python27\Tools\pynche') ) # (‘C:\Python27\Tools’, ‘pynche’) |
Как видите, данная функция берет путь и разъединяет его таким образом, что подпапка стала вторым элементом кортежа с остальной частью пути в первом элементе. Напоследок, взглянем на бытовой случай использования split:
1 2 3 4 5 6 7 8 |
import os dirname, fname = os.path.split(r'C:\Python27\Tools\pynche\ChipViewer.py') print(dirname) # C:\\Python27\\Tools\\pynche print(fname) # ChipViewer.py |
В данном примере указано, как сделать множественное назначение. Когда вы разъединяете путь, он становится кортежем, состоящим из двух частей. После того, как мы опробовали две переменные с левой части, первый элемент кортежа назначен к первой переменной, а второй элемент к второй переменной соответственно.
Подведем итоги
С данного момента модуль os можно смело назвать старым добрым знакомым. В данном разделе мы научились:
- Работать со значениями среды;
- Менять каталоги и находить тот, который в данный момент является рабочим;
- Создавать и удалять папки и файлы;
- Переименовывать папки и файлы;
- Открывать файл в соответствующей ему программе;
- Работать с путями.
И это не полный список того, что можно делать при помощи модуля os.
Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: vasile.buldumac@ati.utm.md
Образование
Universitatea Tehnică a Moldovei (utm.md)
- 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»