Вы вводите в заблуждение встроенную функцию 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))
Согласно [Документах] (HTTP: //docs.python.org/2/library/os.html#os.open), os.open() возвращает дескриптор файла, тогда как встроенный open() возвращает объект файла. – Octipi