Чтобы дать вам общее представление об этом наборе инструментов, проведем несколько интерактивных экспериментов. Встроенные объекты файлов и файловые дескрипторы модуля os обрабатываются различными наборами инструментов, но в реальности они связаны между собой — объекты файлов просто добавляют дополнительную логику поверх дескрипторов файлов.
Метод fileno объекта файла возвращает целочисленный дескриптор, ассоциированный со встроенным объектом файла. Например, объекты файлов стандартных потоков ввода-вывода имеют дескрипторы 0, 1 и 2; вызов функции os.write для отправки данных в stdout по дескриптору дает тот же эффект, что и вызов метода sys.stdout.write:
> >> import sys
> >> for stream in (sys.stdin, sys.stdout, sys.stderr):
… print(stream.fileno())
…
0
1
2
> >> sys.stdout.write(‘Hello stdio world\n’) # записать с помощью метода Hello stdio world # объекта файла
18
> >> import os
> >> os.write(1, b’Hello descriptor world\n’) # записать с помощью модуля os Hello descriptor world
23
Поскольку объекты файлов, открываемые явно, ведут себя точно так же, с одинаковым успехом для обработки конкретного внешнего файла на компьютере можно использовать встроенную функцию open, инструменты из модуля os или и то и другое вместе:
>>> file = open(r’C:\temp\spam.txt’, ‘w’) |
# создать внешний файл, объект |
>>> file.write(‘Hello stdio file\n’) |
# записать с помощью объекта файла |
>>> file.flush() |
# или сразу — функции os.write |
>>> fd = file.fileno() |
# получить дескриптор из объекта |
>>> fd
3
>>> import os
>>> os.write(fd, b’Hello descriptor file\n’) # записать с помощью модуля os
>>> file.close()
C:\temp> type spam.txt # строки, записанные
Hello stdio file # двумя способами
Hello descriptor file
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011