Модуль os в Python

Модуль os предоставляет функции для работы с операционной системой, при этом поведение функций не зависит от ОС, поэтому программы будут переносимыми. Здесь я расписал часто используемые из них. Модуль позволяет работать с файлами, папками, а так же со многими другими объектами операционной системы, как, например, процессы или переменные окружения.

Давайте разберем функции для работы с файлами:

Работа с файлами

os.chmod(path, mode, *, dir_fd=None, follow_symlinks=True)

Функция меняет права доступа к объекту (mode - восьмеричное число)

os.remove(path, *, dir_fd=None)

Удаляет путь к файлу. Если будет папка, функция вернет IsADirectoryError. На Windows почему-то файл не удаляется и выбрасывает ошибку, если смотреть в дебаггере.

os.stat(path)

Выводит свойства файла.

os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)

Переименовывает файл или директорию из src в dst.

os.replace(src, dst, *, src_dir_fd=None, dst_dir_fd=None)

Переименовывает файл или директорию из src в dst. Не очень разобрался, что дескриптор каталога, но, по-видимому, это поддерживает переименование файла.

os.renames(old, new)

Переименовывает old в new, создавая промежуточные директории.

os.truncate(path, length)

Обрезает файл до длины length.

Пример использования функции:

import os
path = 'truncate.txt'
with open(path, 'w') as f:
      f.write('truncate data string')
os.truncate(path, 8) # обрезаем
with open(path, 'r') as f:
      print(f.read()) # 'truncate'
os.unlink(path) # очистка файла
os.utime(path, times=None, *, ns=None, dir_fd=None, follow_symlinks=True)

Модификация времени последнего доступа и изменения файла. Либо times - кортеж (время доступа в секундах, время изменения в секундах), либо ns - кортеж (время доступа в наносекундах, время изменения в наносекундах).

os.mkfifo(path, mode = 0o666, *, dir_fd = None)

Создание именованного пути FIFO с указанным режимом.

os.mknod(path, mode=384, device=0, *, dir_fd=None)

Создание узла файловой системы.

os.open(path, flags, mode=511, *, dir_fd=None)

Открывает файл для низкоуровневого ввода-вывода

os.close(fd)

Закрывает открытый файл.

os.read(fd, n)

Читает первые n байтов.

os.write(fd, str)

Записывает байтовую строку.

Работа с директориями:

os.walk(top, topdown=True, onerror=None, followlinks=False)

Генерация имён файлов в дереве каталогов, сверху вниз (если topdown равен True), либо снизу вверх (если False). Для каждого каталога функция walk возвращает кортеж (путь к каталогу, список каталогов (кроме символов '.', '..'), список файлов).

os.chdir(path)

Смена текущей директории.

os.getcwd()

Возвращает строку, содержащую абсолютный путь текущей рабочей директории.

os.rmdir(path, *, dir_fd=None)

Удаляет пустую директорию.

os.listdir(path=".")

Возвращает список файлов и директорий в папке. По умолчанию директория является текущей.

os.scandir(path=".")

Аналог listdir(), повышающий производительность кода, которому также требуется информация о типе или атрибуте файла.

os.mkdir(path, mode=0o777, *, dir_fd=None)

Создаёт директорию. OSError, если директория существует.

os.makedirs(path, mode=0o777, exist_ok=False)

Создаёт директорию, создавая при этом промежуточные директории.

os.removedirs(path)

Удаляет директорию, затем пытается удалить родительские директории, и удаляет их рекурсивно, пока они пусты.

os.chroot(path)

Изменение корневого каталога текущего процесса на путь.

Пример кода для работы с папками:

import os

dir_name = 'os_directories'

print('creating', dir_name)
os.makedirs(dir_name)

file_name = os.path.join(dir_name, 'example.txt')
print('creating', file_name)
with open(file_name, 'wt') as f:
    f.write('example file')

print('cleaning up')
os.unlink(file_name)
os.rmdir(dir_name)

with os.scandir(dir_name) as it:
  for entry in it:
      if not entry.name.startswith('.') and entry.is_file():
          print(entry.name)

Функции для работы со ссылками:

os.symlink(source, link_name, target_is_directory=False, *, dir_fd=None)

Создаёт символическую ссылку на объект.

os.link(src, dst, *, src_dir_fd=None, dst_dir_fd=None, follow_symlinks=True)

Создаёт жёсткую ссылку.

В чем отличие жесткой ссылки от символической?

СИМВОЛИЧЕСКИЕ ССЫЛКИ

Главное ее отличие от жестких ссылок в том, что при удалении целевого файла ссылка останется, но она будет указывать в никуда, поскольку файла на самом деле больше нет.

Вот основные особенности символических ссылок:

Могут ссылаться на файлы и каталоги; После удаления, перемещения или переименования файла становятся недействительными; Права доступа и номер inode отличаются от исходного файла; При изменении прав доступа для исходного файла, права на ссылку останутся неизменными; Можно ссылаться на другие разделы диска; Содержат только имя файла, а не его содержимое. Теперь давайте рассмотрим жесткие ссылки.

ЖЕСТКИЕ ССЫЛКИ

Этот тип ссылок реализован на более низком уровне файловой системы. Файл размещен только в определенном месте жесткого диска. Но на это место могут ссылаться несколько ссылок из файловой системы. Каждая из ссылок - это отдельный файл, но ведут они к одному участку жесткого диска. Файл можно перемещать между каталогами, и все ссылки останутся рабочими, поскольку для них неважно имя.

Особенности: Работают только в пределах одной файловой системы; Нельзя ссылаться на каталоги; Имеют ту же информацию inode и набор разрешений что и у исходного файла; Разрешения на ссылку изменяться при изменении разрешений файла; Можно перемещать и переименовывать и даже удалять файл без вреда ссылке.

os.readlink(path, *, dir_fd=None)

Возвращает строку, представляющую путь, на который указывает символическая ссылка.

os.lchown(path, uid, gid)

os.chown(), но не использует символические ссылки.

os.lchmod(path, mode)

os.chmod(), но если путь - символическая ссылка, то изменяет её, а не объект.

os.lstat(path, *, dir_fd=None)

os.stat(), но не использует символические ссылки.

Функции и переменные для работы с ОС:

os.system(command)

Исполняет системную команду, возвращает код её завершения (0, если успешно).

os.name

Переменная имени операционной системы. Доступные значения: 'posix', 'nt', 'mac', 'os2', 'ce', 'java'.

os.get_terminal_size()

Возвращает размер терминала в формате os.terminal_size(columns=80, lines=24).

os.environ

Словарь переменных окружения. Является изменямым и дополняемым. Отображает информацию о системе.

os.getenv()

В отличие от os.environ в случае отсутствия объекта вместо сообщении об ошибке ничего не делает.

os.putenv()

Изменяет выбранную переменную окружения.

os.getlogin()

Возвращает имя пользователя, вошедшего в терминал.

os.uname()

Возвращает объект с полями: sysname - имя ОС, nodename - имя машины в сети (имя рабочей группы), release - номер релиза, version - версия, machine - идентификатор машины (разрядность). Доступен только в недавних разновидностях UNIX.

os.chown(path, uid, gid, *, dir_fd=None, follow_symlinks=True)

Меняет id владельца и группы (Unix).

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 - доступен на исполнение.

Пример использования:

try:
    fp = open("myfile")
except PermissionError:
   return "Error"
else:
    with fp:
       return fp.read()
os.urandom(n)

Возвращает n случайных байт(!). Полезно, если хотите использовать это в криптографии.

os.getpid()

Возвращает текущий id процесса.

os.sync()

Записывает все данные на диск. Доступен только на UNIX.

Создание и управление процессами:

os.get_terminal_size()

Возвращает размер терминала в формате os.terminal_size(columns=80, lines=24).

os.add_dll_directory(path)

Добавляет путь к пути поиска dll (динамически подключаемая библиотека, в которой программы могут хранить функции, переменные и т.д.)

os.startfile(path[, operation][, arguments][, cwd][, show_cmd])

Запускает файл с помощью указанной программы (по умолчанию работает как двойной щелчок)

os.spawn*(mode, ...)
l - фиксированное число параметров
v - переменное число параметров
p - использование переменной PATH
e - env (используется вместо среды текущего процесса)
Пример:
os.spawnve(mode, path, args, env)

Запускает программу в новом процессе

os.exec*(args, ...)

Принимает список аргументов для новой программы, загруженной в процесс. Варианты функции аналогичны указанным в os.spawn*()

os.popen(cmd, mode='r', buffering=-1)

Открывает канал для чтения или записи стандартного ввода-вывода запущенной команды cmd

os.plock(op)

Закрепляет выбранную часть программного процесса в памяти

os.kill(pid, sig)

Посылает сигнал sig процессу pid

os.abort()

Передача сигнала SIGABRT

os._exit(stat)

Завершает процесс с заданным статусом

Модуль PATH:

os.path

Вложенный модуль, упрощающий работу с путями, имеет множество функций. Среди них:

os.path.dirname(path) - возвращает имя директории пути path,
os.path.exists(path) - возвращает True, если path указывает на существующий путь,
os.path.expanduser(path) - заменяет ~ или ~user на домашнюю директорию пользователя,
os.path.getatime(path) - время последнего доступа к файлу, в секундах,
os.path.getmtime(path) - время последнего изменения файла, в секундах,
os.path.getctime(path) - время создания файла (Windows), время последнего изменения файла (Unix),
os.path.getsize(path) - размер файла в байтах,
os.path.isabs(path) - является ли путь абсолютным,
os.path.isfile(path) - является ли путь файлом,
os.path.isdir(path) - является ли путь директорией,
os.path.islink(path) - является ли путь символической ссылкой,
os.path.join(path1[, path2[, ...]]) - соединяет пути с учётом особенностей операционной системы,
os.path.normcase(path) - нормализует регистр пути (на файловых системах, не учитывающих регистр, приводит путь к нижнему регистру),
os.path.normpath(path) - нормализует путь, убирая избыточные разделители и ссылки на предыдущие директории,
os.path.realpath(path) - возвращает канонический путь, убирая все символические ссылки (если они поддерживаются),
os.path.relpath(path, start=None) - вычисляет путь относительно директории start (по умолчанию - относительно текущей директории),
os.path.samefile(path1, path2) - указывают ли path1 и path2 на один и тот же файл или директорию,
os.path.split(path) - разбивает путь на кортеж (голова, хвост),
os.path.supports_unicode_filenames - поддерживает ли файловая система Unicode

Задачи на использование функций

Задача 1:

Напишите программу, которая выводит 'Hello, $USER!', где $USER - имя пользователя. Пользоваться print() запрещено.

Задача 2:

Напишите программу, которая выводит дерево файлов по заданному пути. В ней должны быть: а) фильтр по названиям б) вывод типа файла: является ли файл символической ссылкой или является обычным файлом

Задача 3:

Петя только начал изучать программирование и пока не научился пользоваться командой git clone, поэтому скачал несколько репозиториев с Github в .zip формате. Но вот незадача: файлы программ не являются исполняемыми. Есть несколько .zip архивов, в них содержатся файлы необходимых проектов на языке Python. Напишите программу, которая разархивирует проекты в отдельные папки с тем же названием проектов и сделает все Python файлы исполняемыми.

Задача 4:

Напишите программу, которая проверяет, есть ли в переменных окружения заданный путь. Если переменная есть, вывести название переменной, если ее нет - создать с именем 'OS_PRACTICE