В чем разница между io.open () и os.open () на Python? - PullRequest
34 голосов
/ 28 августа 2011

Я понял, что функция open(), которую я использовал, была псевдонимом io.open(), и что импорт * из os затмил бы это.

В чем разница между открытием файлов с помощью модуля io и os?

Ответы [ 6 ]

28 голосов
/ 28 августа 2011

io.open() является предпочтительным высокоуровневым интерфейсом для файлового ввода-вывода. Он оборачивает файловый дескриптор уровня ОС в объект, который вы можете использовать для доступа к файлу в Pythonic.

os.open() - это просто оболочка для системного вызова POSIX нижнего уровня. Он принимает меньше символических (и больше POSIX-y) аргументов и возвращает дескриптор файла (число), который представляет открытый файл. не возвращает объект файла; возвращаемое значение не будет иметь read() или write() методов.

Из os.open() документации :

Эта функция предназначена для низкоуровневых входов / выходов. Для обычного использования используйте встроенную функцию open(), которая возвращает «файловый объект» с методами read() и write() (и многими другими).

7 голосов
/ 28 августа 2011

Абсолютно все:

  • os.open() принимает имя файла в виде строки, режим файла какпобитовая маска атрибутов и необязательный аргумент , который описывает биты прав доступа к файлу и возвращает дескриптор файла в виде целого числа.

  • io.open() принимает имя файла в виде строки или дескриптор файла в качестве целого числа, режим файла в качестве строки и необязательные аргументы которые описывают кодировку файла, используемую буферизацию, как обрабатываются ошибки кодирования и символы новой строки, и если базовый FD закрывается при закрытии файла, и возвращает некоторый потомок io.IOBase.

4 голосов
/ 28 августа 2011

os.open очень похож на open() из C в Unix . Вы вряд ли захотите использовать его, если не делаете что-то гораздо более низкого уровня. Он дает вам фактический дескриптор файла (как, например, число, а не объект).

io.open - ваш базовый Python open() и то, что вы хотите использовать практически все время.

0 голосов
/ 21 мая 2019

Разработчики баз данных и системных приложений обычно используют open вместо fopen, поскольку первый обеспечивает более точный контроль того, когда, что и как содержимое памяти должно быть записано в его резервное хранилище (то есть файл на диске).

В Unix-подобной операционной системе open используется для открытия обычного файла, конечной точки сокета, устройства, канала и т. Д. Положительный номер дескриптора файла возвращается при каждом успешном вызове функции open. Он предоставляет согласованный API и платформу для проверки уведомлений о событиях и т. Д. Для различных этих объектов.

Тем не менее, fopen является стандартной функцией C и обычно используется для открытия обычного файла и возврата структуры данных FILE. fopen, на самом деле, в конце концов позвонит open. fopen достаточно для обычного использования, так как разработчикам не нужно беспокоиться о том, когда нужно сбрасывать или синхронизировать содержимое памяти на диск, и не нужно уведомлять о событиях.

0 голосов
/ 18 марта 2019

Чтобы добавить к существующим ответам:

Я понял, что используемая мной функция open () была псевдонимом io.open ()

open() == io.open() только в Python 3. В Python 2 они разные.

В то время как с помощью open() в Python мы можем получить простой в использовании файловый объект с удобными методами read() и write(), но на уровне ОС доступ к файлам осуществляется с помощью файловых дескрипторов (или файловых дескрипторов в Windows). Таким образом, os.open() должен использоваться неявно под капотом. Я не исследовал исходный код Python в этом отношении, но документация для параметра opener, который был добавлен для open() в Python 3.3, гласит:

Пользовательский открыватель можно использовать, передавая вызываемое значение как открыватель . базовый дескриптор файла для объекта файла затем получается вызов открывалка с ( файл , flags ). opener должен вернуть открытый файл дескриптор (передача os.open как opener приводит к аналогичной функциональности на прохождение None).

Так что os.open() является открывателем по умолчанию для open(), и у нас также есть возможность указать пользовательскую оболочку вокруг него, если необходимо изменить флаги файлов или режим. См. документацию для open() для примера пользовательского открывателя, который открывает файл относительно данного каталога.

0 голосов
/ 28 августа 2011

os.open() метод открывает файл файла и устанавливает различные флаги в соответствии с флагами и, возможно, его режим в соответствии с режимом.

Режим по умолчанию - 0777 (восьмеричное), и текущее значение маскирования сначала маскируется..

Этот метод возвращает дескриптор файла для вновь открытого файла.

В то время как метод

io.open() открывает файл в режиме, указанном в строковом режиме.Возвращает новый дескриптор файла или, в случае ошибки, ноль плюс сообщение об ошибке.

Надеюсь, это поможет

...