> **Источник:** https://python-all.ru/2.6/c-api/file.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# Объекты файлов

Встроенные файловые объекты Python полностью реализованы на основе поддержки `FILE*` из стандартной библиотеки C. Это деталь реализации, которая может измениться в будущих версиях Python.

**`PyFileObject`**

Этот подтип

[`PyObject`](https://python-all.ru/2.6/c-api/structures.html#PyObject)

представляет файловый объект Python.

**[PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject) `PyFile_Type`**

Этот экземпляр [`PyTypeObject`](https://python-all.ru/2.6/c-api/type.html#PyTypeObject) представляет тип файла Python. Он доступен программам Python как `file` и `types.FileType`.

**int `PyFile_Check`([PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject) *\*p*)**

Возвращает true, если аргумент является [`PyFileObject`](https://python-all.ru/2.6/c-api/file.html#PyFileObject) или подтипом [`PyFileObject`](https://python-all.ru/2.6/c-api/file.html#PyFileObject).

Изменено в версии 2.2: Теперь допускаются подтипы.

**int `PyFile_CheckExact`([PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject) *\*p*)**

Возвращает true, если аргумент является [`PyFileObject`](https://python-all.ru/2.6/c-api/file.html#PyFileObject), но не подтипом [`PyFileObject`](https://python-all.ru/2.6/c-api/file.html#PyFileObject).

Новое в версии 2.2.

**[PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject)\* `PyFile_FromString`(char *\*filename*, char *\*mode*)**

*Возвращаемое значение: новая ссылка.*

В случае успеха возвращает новый файловый объект, открытый для файла, заданного *filename*, с режимом файла, заданным *mode*, где *mode* имеет ту же семантику, что и стандартная функция C `fopen()`. В случае ошибки возвращает *NULL*.

**[PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject)\* `PyFile_FromFile`(FILE *\*fp*, char *\*name*, char *\*mode*, int *(\*close)(FILE\*)*)**

*Возвращаемое значение: новая ссылка.*

Создаёт новый [`PyFileObject`](https://python-all.ru/2.6/c-api/file.html#PyFileObject) из уже открытого стандартного указателя C файла *fp*. Функция *close* будет вызвана, когда файл должен быть закрыт. В случае ошибки возвращает *NULL*.

**FILE\* `PyFile_AsFile`([PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject) *\*p*)**

Возвращает файловый объект, связанный с *p*, в виде `FILE*`.

Если вызывающий код когда-либо будет использовать возвращаемый объект `FILE*`, когда GIL освобождён, он также должен вызывать функции [`PyFile_IncUseCount()`](https://python-all.ru/2.6/c-api/file.html#PyFile_IncUseCount) и [`PyFile_DecUseCount()`](https://python-all.ru/2.6/c-api/file.html#PyFile_DecUseCount), описанные ниже, по мере необходимости.

**void `PyFile_IncUseCount`([PyFileObject](https://python-all.ru/2.6/c-api/file.html#PyFileObject) *\*p*)**

Увеличивает внутренний счётчик использования PyFileObject, чтобы указать, что базовый `FILE*` используется. Это предотвращает вызов Python'ом f\_close() для него из другого потока. Вызывающие это должны вызывать [`PyFile_DecUseCount()`](https://python-all.ru/2.6/c-api/file.html#PyFile_DecUseCount), когда закончат работу с `FILE*`. В противном случае файловый объект никогда не будет закрыт Python'ом.

GIL должен быть захвачен при вызове этой функции.

Рекомендуется вызывать это после [`PyFile_AsFile()`](https://python-all.ru/2.6/c-api/file.html#PyFile_AsFile), непосредственно перед освобождением GIL.

Новое в версии 2.6.

**void `PyFile_DecUseCount`([PyFileObject](https://python-all.ru/2.6/c-api/file.html#PyFileObject) *\*p*)**

Уменьшает внутренний член unlocked\_count PyFileObject, чтобы указать, что вызывающий завершил собственное использование `FILE*`. Это может быть вызвано только для отмены предыдущего вызова [`PyFile_IncUseCount()`](https://python-all.ru/2.6/c-api/file.html#PyFile_IncUseCount).

GIL должен быть захвачен при вызове этой функции.

Новое в версии 2.6.

**[PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject)\* `PyFile_GetLine`([PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject) *\*p* *n*)**

*Возвращаемое значение: новая ссылка.*

Эта функция эквивалентна `p.readline([n])` и читает одну строку из объекта *p*. *p* может быть файловым объектом или любым объектом, имеющим метод `readline()`. Если *n* равно `0`, читается ровно одна строка, независимо от её длины. Если *n* больше `0`, из файла будет прочитано не более *n* байт; может быть возвращена неполная строка. В обоих случаях возвращается пустая строка, если конец файла достигнут сразу. Однако если *n* меньше `0`, читается одна строка независимо от длины, но если конец файла достигнут сразу, возбуждается [`EOFError`](https://python-all.ru/2.6/library/exceptions.html#exceptions.EOFError).

**[PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject)\* `PyFile_Name`([PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject) *\*p*)**

*Возвращаемое значение: заимствованная ссылка.*

Возвращает имя файла, указанного *p*, в виде строкового объекта.

**void `PyFile_SetBufSize`([PyFileObject](https://python-all.ru/2.6/c-api/file.html#PyFileObject) *\*p*, int *n*)**

Доступно только в системах с `setvbuf()`. Это следует вызывать только сразу после создания файлового объекта.

**int `PyFile_SetEncoding`([PyFileObject](https://python-all.ru/2.6/c-api/file.html#PyFileObject) *\*p*, const char *\*enc*)**

Устанавливает кодировку файла для вывода Unicode в *enc*. Возвращает 1 в случае успеха и 0 в случае ошибки.

Новое в версии 2.3.

**int `PyFile_SetEncodingAndErrors`([PyFileObject](https://python-all.ru/2.6/c-api/file.html#PyFileObject) *\*p*, const char *\*enc*, \*errors)**

Устанавливает кодировку файла для вывода Unicode в *enc* и режим обработки ошибок в *err*. Возвращает 1 в случае успеха и 0 в случае ошибки.

Новое в версии 2.6.

**int `PyFile_SoftSpace`([PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject) *\*p*, int *newflag*)**

Эта функция существует для внутреннего использования интерпретатором. Устанавливает атрибут `softspace` объекта *p* в значение *newflag* и возвращает предыдущее значение. Для корректной работы этой функции *p* не обязан быть файловым объектом; поддерживается любой объект (хотя это имеет смысл только если атрибут `softspace` может быть установлен). Эта функция очищает все ошибки и вернёт `0` в качестве предыдущего значения, если атрибут не существует или возникли ошибки при его получении. Из этой функции невозможно определить наличие ошибок, но это и не должно требоваться.

**int `PyFile_WriteObject`([PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject) *\*obj*, [PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject) *\*p*, int *flags*)**

Записывает объект *obj* в файловый объект *p*. Единственный поддерживаемый флаг для *flags* – `Py_PRINT_RAW`; если он задан, записывается [`str()`](https://python-all.ru/2.6/library/functions.html#str) объекта вместо [`repr()`](https://python-all.ru/2.6/library/functions.html#repr). Возвращает `0` при успехе или `-1` при ошибке; будет установлено соответствующее исключение.

**int `PyFile_WriteString`(const char *\*s*, [PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject) *\*p*)**

Записывает строку

*s*

в файловый объект

*p*

. Возвращает

`0`

при успехе или

`-1`

при ошибке; будет установлено соответствующее исключение.
