file.md
1> **Источник:** https://python-all.ru/3.8/c-api/file.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Объекты файлов89Эти API являются минимальной эмуляцией C API Python 2 для встроенных файловых объектов, которые ранее полагались на поддержку буферизированного ввода-вывода (`FILE*`) из стандартной библиотеки C. В Python 3 файлы и потоки используют новый модуль [`io`](https://python-all.ru/3.8/library/io.html#module-io), который определяет несколько уровней поверх низкоуровневого небуферизированного ввода-вывода операционной системы. Описанные ниже функции – это удобные обёртки на C для этих новых API, предназначенные в основном для внутреннего сообщения об ошибках в интерпретаторе; стороннему коду рекомендуется вместо этого использовать API [`io`](https://python-all.ru/3.8/library/io.html#module-io).1011#### `PyObject* PyFile_FromFd(int fd, const char *name, const char *mode, int buffering, const char *encoding, const char *errors, const char *newline, int closefd)`1213*Возвращаемое значение: новая ссылка.*1415Создаёт объект файла Python из файлового дескриптора уже открытого файла *fd*. Аргументы *name*, *encoding*, *errors* и *newline* могут быть `NULL` для использования значений по умолчанию; *buffering* может быть *-1* для использования значения по умолчанию. *name* игнорируется и сохранён для обратной совместимости. Возвращает `NULL` в случае неудачи. За более подробным описанием аргументов обратитесь к документации функции [`io.open()`](https://python-all.ru/3.8/library/io.html#io.open).1617> **Предупреждение**18>19> Поскольку потоки Python имеют собственный уровень буферизации, их смешивание с файловыми дескрипторами ОС может вызвать различные проблемы (например, непредсказуемый порядок данных).2021Изменено в версии 3.2: Игнорируется атрибут *name*.2223#### `int PyObject_AsFileDescriptor(PyObject *p)`2425Возвращает файловый дескриптор, связанный с *p*, в виде `int`. Если объект является целым числом, возвращается его значение. Если нет, вызывается метод [`fileno()`](https://python-all.ru/3.8/library/io.html#io.IOBase.fileno) объекта, если он существует; метод должен вернуть целое число, которое и будет значением файлового дескриптора. В случае ошибки устанавливает исключение и возвращает `-1`.2627#### `PyObject* PyFile_GetLine(PyObject *p, int n)`2829*Возвращаемое значение: новая ссылка.*3031Эквивалентно `p.readline([n])`; эта функция читает одну строку из объекта *p*. *p* может быть файловым объектом или любым объектом с методом [`readline()`](https://python-all.ru/3.8/library/io.html#io.IOBase.readline). Если *n* равно `0`, читается ровно одна строка независимо от её длины. Если *n* больше `0`, из файла будет прочитано не более *n* байт; может быть возвращена неполная строка. В обоих случаях возвращается пустая строка, если конец файла достигнут сразу. Однако, если *n* меньше `0`, читается одна строка независимо от длины, но при немедленном достижении конца файла возбуждается [`EOFError`](https://python-all.ru/3.8/library/exceptions.html#EOFError).3233#### `int PyFile_SetOpenCodeHook(Py_OpenCodeHookFunction handler)`3435Переопределяет обычное поведение [`io.open_code()`](https://python-all.ru/3.8/library/io.html#io.open_code), передавая его параметр через указанный обработчик.3637Обработчик – это функция типа `PyObject *(*)(PyObject *path, void *userData)`, где *path* гарантированно является [`PyUnicodeObject`](https://python-all.ru/3.8/c-api/unicode.html#c.PyUnicodeObject).3839Указатель *userData* передаётся в функцию-обработчик. Поскольку функции-обработчики могут вызываться из разных сред выполнения, этот указатель не должен напрямую ссылаться на состояние Python.4041Поскольку этот перехватчик намеренно используется во время импорта, избегайте импорта новых модулей во время его выполнения, если только они не заморожены или не доступны в `sys.modules`.4243После установки перехватчик нельзя удалить или заменить; последующие вызовы [`PyFile_SetOpenCodeHook()`](https://python-all.ru/3.8/c-api/file.html#c.PyFile_SetOpenCodeHook) будут завершаться ошибкой. В случае неудачи функция возвращает -1 и устанавливает исключение, если интерпретатор уже инициализирован.4445Эту функцию можно безопасно вызывать до [`Py_Initialize()`](https://python-all.ru/3.8/c-api/init.html#c.Py_Initialize).4647Возбуждает [событие аудита](https://python-all.ru/3.8/library/sys.html#auditing) `setopencodehook` без аргументов.4849Новое в версии 3.8.5051#### `int PyFile_WriteObject(PyObject *obj, PyObject *p, int flags)`5253Записывает объект *obj* в файловый объект *p*. Единственный поддерживаемый флаг для *flags* – это `Py_PRINT_RAW`; если он указан, записывается [`str()`](https://python-all.ru/3.8/library/stdtypes.html#str) объекта вместо [`repr()`](https://python-all.ru/3.8/library/functions.html#repr). Возвращает `0` при успехе или `-1` при ошибке; устанавливается соответствующее исключение.5455#### `int PyFile_WriteString(const char *s, PyObject *p)`5657Записывает строку *s* в файловый объект *p*. Возвращает `0` при успехе или `-1` при ошибке; будет установлено соответствующее исключение.58