Ответ 1
Вы вводите в заблуждение встроенную функцию open()
с os.open()
, предоставляемую модулем os
. Они совершенно разные; os.open(filename, "w")
недействителен Python (os.open
принимает в качестве второго аргумента целочисленные флаги), open(filename, "w")
is.
Короче говоря, open()
создает новые файловые объекты, os.open()
создает дескрипторы файла уровня ОС, а os.fdopen()
создает объект файл из файлового дескриптора.
Дескрипторы файлов - это низкоуровневое средство для работы с файлами, напрямую предоставляемыми ядром операционной системы. Дескриптор файла представляет собой небольшое целое число, которое идентифицирует открытый файл в таблице открытых файлов, хранящихся в ядре для каждого процесса. Ряд системных вызовов принимают файловые дескрипторы, но с ними не удобно работать, как правило, требуются буферы с фиксированной шириной, множественные повторы в определенных условиях и ручная обработка ошибок.
Файловые объекты - это классы Python, которые обертывают файловые дескрипторы, чтобы сделать работу с файлами более удобной и менее подверженной ошибкам. Они обеспечивают, например, обработку ошибок, буферизацию, построчное чтение, преобразование кодировки и закрываются при сборе мусора.
Повторить:
-
Встроенный
open()
принимает имя файла и возвращает новый объект файла Python. Это то, что вам нужно в большинстве случаев. -
os.open()
принимает имя файла и возвращает новый файловый дескриптор. Этот файловый дескриптор может быть передан другим низкоуровневым функциям, таким какos.read()
иos.write()
, илиos.fdopen()
, как описано ниже. Это нужно только при написании кода, зависящего от зависимых от операционной системы API, например, с помощью флагаO_EXCL
доopen(2)
. -
os.fdopen()
принимает существующий файловый дескриптор, обычно создаваемый системными вызовами Unix, такими какpipe()
илиdup()
, и создает вокруг него объект файла Python. Фактически он преобразует дескриптор файла в полный файловый объект, что полезно при взаимодействии с C-кодом или с API-интерфейсами, которые создают только низкоуровневые файловые дескрипторы.
Встроенный open
может быть реализован с помощью os.open()
(для создания дескриптора файла) и os.fdopen()
(чтобы обернуть его в файл-объект):
# equivalent to open(filename, "r")
f = os.fdopen(os.open(filename, os.O_RDONLY))