Модуль 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'