文件对象 — Python 文档

来自菜鸟教程
Python/docs/2.7/c-api/file
跳转至:导航、​搜索

文件对象

Python 的内置文件对象完全在 C 标准库的 FILE* 支持上实现。 这是一个实现细节,可能会在 Python 的未来版本中发生变化。

type PyFileObject
PyObject 的这个子类型代表一个 Python 文件对象。
PyTypeObject PyFile_Type
PyTypeObject 的这个实例表示 Python 文件类型。 这以 filetypes.FileType 的形式暴露给 Python 程序。
int PyFile_Check(PyObject *p)

如果其参数是 PyFileObjectPyFileObject 的子类型,则返回 true。

在 2.2 版更改:允许接受子类型。

int PyFile_CheckExact(PyObject *p)

如果其参数是 PyFileObject,但不是 PyFileObject 的子类型,则返回 true。

2.2 版中的新功能。

PyObject *PyFile_FromString(char *filename, char *mode)
成功时,返回在 filename 给出的文件上打开的新文件对象,文件模式由 mode 给出,其中 mode 具有相同的语义作为标准 C 程序 fopen()。 失败时,返回 NULL
PyObject *PyFile_FromFile(FILE *fp, char *name, char *mode, int (*close)(FILE*))
从已经打开的标准 C 文件指针 fp 创建一个新的 PyFileObject。 当文件应该关闭时,函数 close 将被调用。 返回 NULL 并在失败时使用 close 关闭文件。 close 是可选的,可以设置为 NULL
FILE* PyFile_AsFile(PyObject \*p)

将与 p 关联的文件对象作为 FILE* 返回。

如果调用者在释放 GIL 时将使用返回的 FILE* 对象,则它还必须适当地调用下面描述的 PyFile_IncUseCount()PyFile_DecUseCount() 函数。

void PyFile_IncUseCount(PyFileObject \*p)

增加 PyFileObject 的内部使用计数以指示正在使用底层 FILE*。 这可以防止 Python 从另一个线程调用 f_close() 。 调用者在完成 FILE* 后必须调用 PyFile_DecUseCount()。 否则文件对象永远不会被 Python 关闭。

GIL 必须在调用此函数时保持。

建议的用法是在 PyFile_AsFile() 之后和释放 GIL 之前调用它:

FILE *fp = PyFile_AsFile(p);
PyFile_IncUseCount(p);
/* ... */
Py_BEGIN_ALLOW_THREADS
do_something(fp);
Py_END_ALLOW_THREADS
/* ... */
PyFile_DecUseCount(p);

2.6 版中的新功能。

void PyFile_DecUseCount(PyFileObject \*p)

减少 PyFileObject 的内部 unlocked_count 成员,以指示调用者完成了对 FILE* 的使用。 这只能被调用以撤消先前对 PyFile_IncUseCount() 的调用。

调用此函数时必须保持 GIL(参见上面的示例)。

2.6 版中的新功能。

PyObject *PyFile_GetLine(PyObject *p, int n)
相当于p.readline([n]),该函数从对象p读取一行。 p 可以是文件对象或任何具有 readline() 方法的对象。 如果 n0,则无论行的长度如何,都只读取一行。 如果n大于0,则从文件中读取不超过n个字节; 可以返回部分行。 在这两种情况下,如果立即到达文件末尾,则返回空字符串。 但是,如果 n 小于 0,则无论长度如何都读取一行,但如果立即到达文件末尾,则会引发 EOFError
PyObject *PyFile_Name(PyObject *p)
p 指定的文件名作为字符串对象返回。
void PyFile_SetBufSize(PyFileObject *p, int n)
仅在带有 setvbuf() 的系统上可用。 这应该只在文件对象创建后立即调用。
int PyFile_SetEncoding(PyFileObject *p, const char *enc)

将 Unicode 输出的文件编码设置为 enc。 成功返回 1,失败返回 0

2.3 版中的新功能。

int PyFile_SetEncodingAndErrors(PyFileObject *p, const char *enc, *errors)

将 Unicode 输出的文件编码设置为 enc,并将其错误模式设置为 err。 成功返回 1,失败返回 0

2.6 版中的新功能。

int PyFile_SoftSpace(PyObject *p, int newflag)
此函数存在供解释器内部使用。 将psoftspace属性设置为newflag并返回之前的值。 p 不必是该函数正常工作的文件对象; 支持任何对象(认为只有在可以设置 softspace 属性时才有趣)。 此函数清除所有错误,如果该属性不存在或检索时出错,则返回 0 作为先前值。 没有办法从这个函数中检测错误,但应该不需要这样做。
int PyFile_WriteObject(PyObject *obj, PyObject *p, int flags)
将对象 obj 写入文件对象 pflags 唯一支持的标志是 Py_PRINT_RAW; 如果给定,则写入对象的 str() 而不是 repr()。 成功返回 0,失败返回 -1; 将设置适当的例外。
int PyFile_WriteString(const char *s, PyObject *p)
将字符串 s 写入文件对象 p。 成功返回 0,失败返回 -1; 将设置适当的例外。