В модуле os имеется также ряд инструментов для работы с файлами, которые принимают строку пути к файлу и выполняют ряд операций, связанных с файлами, таких как переименование (os.rename), удаление (os.remove) и изменение владельца файла и прав доступа к нему (os. chown, os.chmod). Рассмотрим несколько примеров использования этих инструментов:
> >> os.chmod(‘spam.txt’, 0o777) # разрешить доступ всем пользователям
Функции os.chmod установки прав доступа к файлу передается строка из девяти битов, состоящая из трех групп, по три бита в каждой. Эти три группы определяют права доступа, слева направо, для пользователя- владельца файла, для группы пользователей, которой принадлежит файл, и для всех остальных. Три бита внутри каждой группы отражают право на чтение, на запись и на выполнение. Если какой-то бит в этой строке равен «1», это означает разрешение на выполнение соответствующей операции. Например, восьмеричное число 0777 является строкой из девяти единичных битов в двоичном представлении и разрешает все три вида доступа для всех трех групп пользователей; восьмеричное число 0600 означает возможность только чтения и записи для пользователя, который владеет файлом (восьмеричное число 0600 в двоичной записи дает 110 000 000).
Эта схема ведет свое происхождение от системы прав доступа в Unix, но работает также в Windows. Если она вас озадачила, посмотрите описание команды chmod в документации по вашей системе (например, в страницах руководства Unix). Идем дальше:
> >> os.rename(r’C:\temp\spam.txt’, r’C:\temp\eggs.txt’) # откуда, куда
>>> os.remove(r’C:\temp\spam.txt’) # удалить файл?
WindowsError: [Error 2] The system cannot find the file specified: ‘C:\\ temp\\…’
(WindowsError: [Error 2] Системе не удается найти указанный путь: ‘C:\\ temp\\…’)
>>> os.remove(r’C:\temp\eggs.txt’)
Использованная здесь функция os.rename изменяет имя файла; функция os.remove удаляет файл, она синонимична функции os.unlink (имя последней — имя, которое имеет эта функция в Unix, но оно не знакомо пользователям других платформ)[X]. Модуль os также экспортирует системный вызов stat:
> >> open(‘spam.txt’, ‘w’).write(‘Hello stat world\n’) # +1 для символа \r
17
> >> import os
> >> info = os.stat(r’C:\temp\spam.txt’)
> >> info
nt.stat_result(st_mode=33206, st_ino=0, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=18, st_atime=1267645806, st_mtime=1267646072, st_ ctime=1267645806)
> >> info.st_mode, info.st_size # через атрибуты именованного кортежа (33206, 18)
> >> import stat
> >> info[stat.ST_MODE], info[stat.ST_SIZE] # через константы в модуле stat
(33206, 18)
> >> stat.S_ISDIR(info.st_mode), stat.S_ISREG(info.st_mode)
(False, True)
Функция os.stat возвращает кортеж величин (в версии 3.X это особая разновидность кортежа, элементы которого имеют имена), представляющих низкоуровневую информацию о файле с указанным именем, а модуль stat экспортирует константы и функции для получения этой информации переносимым способом. Например, значение, получаемое из результата функции os.stat по индексу stat.ST_SIZE, соответствует размеру файла, а вызов функции stat.S_ISDIR с параметром «режим», полученным из результата функции os.stat, позволяет проверить, является ли файл каталогом. Однако, как было показано выше, обе эти операции доступны и в модуле os.path, поэтому на практике редко возникает необходимость использовать функцию os.stat; исключение составляют низкоуровневые запросы:
> >> path = r’C:\temp\spam.txt’
> >> os.path.isdir(path), os.path.isfile(path), os.path.getsize(path)
(False, True, 18)
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011