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