Зачем же нужны дополнительные файловые средства в модуле os? Если вкратце, то они обеспечивают более низкоуровневое управление обработкой файлов. Встроенная функция open проста в использовании, но она ограничена возможностями файловой системы, которую использует, и добавляет некоторые дополнительные особенности, которые могут быть нежелательны. Модуль os позволяет сценариям быть более точными; например, следующий фрагмент открывает дескриптор файла в двоичном режиме для чтения-записи, выполняя битовую операцию «ИЛИ» над двумя флагами режима, экспортируемыми модулем os:
>>> fdfile = os.open(r’C:\temp\spam.txt’, (os.O_RDWR | os.O_BINARY))
> >> os.read(fdfile, 20)
b’Hello stdio file\r\nHe’
> >> os.lseek(fdfile, 0, 0) # вернуться в начало файла
> >> os.read(fdfile, 100) # в двоичном режиме сохраняются “\r\n”
b’Hello stdio file\r\nHello descriptor file\n’
> >> os.lseek(fdfile, 0, 0)
> >> os.write(fdfile, b’HELLO’) # перезаписать первые 5 байтов 5
C:\temp> type spam.txt
HELLO stdio file
Hello descriptor file
В данном случае эквивалентный режим открытия с помощью встроенной функции open определяется строками “rb+” и “r+b”:
> >> file = open(r’C:\temp\spam.txt’, ‘rb+’) # то же самое, но с помощью open
> >> file.read(20) # и объектов файлов
b’HELLO stdio file\r\nHe’
> >> file.seek(0)
> >> file.read(100)
b’HELLO stdio file\r\nHello descriptor file\n’
> >> file.seek(0)
>>> file.write(b’Jello’)
5
>>> file.seek(0)
>>> file.read()
b’Jello stdio file\r\nHello descriptor file\n’
В некоторых системах флаги для функции os.open позволяют указывать более сложные режимы — например, исключительный доступ (O_EXCL) и неблокирующий режим (O_NONBLOCK). Некоторые из этих флагов не переносимы между платформами (еще одна причина в пользу встроенных объектов файлов). Найти полный список других флагов открытия можно в руководстве по библиотеке или вызвав на своем компьютере функцию dir(os).
И последнее замечание: в Python использование функции os.open с флагом O_EXCL на сегодняшний день является наиболее переносимым способом исключить возможность параллельного изменения файла или обеспечить синхронизацию с другими процессами. Где может использоваться эта особенность, мы увидим в следующей главе, когда приступим к исследованию инструментов параллельной обработки данных. Программам, параллельно выполняющимся на сервере, к примеру, может потребоваться устанавливать блокировку на файлы, прежде чем изменять их, если подобные изменения могут одновременно запрашиваться несколькими потоками выполнения или процессами.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011