gpt4 book ai didi

python - 文件是如何实现的?

转载 作者:太空狗 更新时间:2023-10-30 01:46:24 26 4
gpt4 key购买 nike

我很好奇文件在 python 中是如何工作的。文件是如何实现的,以便能够像这样循环:

csv_file = open("filename.csv", "r")
for line in csv_file:
# do something with line

最佳答案

如果您使用的是 Python 2,则细节会有些模糊; alexmcf's answer涵盖了基础知识,您可以从那里查看更多详细信息。

如果您使用的是 Python 3,所有内容都在 io 中进行了非常详细的记录。模块,并带有一个合理可读的 pure Python implementation在 stdlib 中,所有这些都建立在一个非常简单的“原始文件”接口(interface)之上(FileIO 在 Unix 上的 POSIX native 文件描述符之上实现)。

IOBase ABC/mixin在readline方法的基础上提供了一个__iter__方法:

IOBase (and its subclasses) supports the iterator protocol, meaning that an IOBase object can be iterated over yielding the lines in a stream. Lines are defined slightly differently depending on whether the stream is a binary stream (yielding bytes), or a text stream (yielding character strings). See readline() below.

如果你看inside the 3.5 source ,它就像您期望的那样简单:

def __iter__(self):
self._checkClosed()
return self

def __next__(self):
line = self.readline()
if not line:
raise StopIteration
return line

当然,在 CPython 3.1+ 中,如果可能的话,有一个 C 加速器用于代替该 Python 代码,但是 it looks pretty similar :

static PyObject *
iobase_iter(PyObject *self)
{
if (_PyIOBase_check_closed(self, Py_True) == NULL)
return NULL;

Py_INCREF(self);
return self;
}

static PyObject *
iobase_iternext(PyObject *self)
{
PyObject *line = PyObject_CallMethodObjArgs(self, _PyIO_str_readline, NULL);

if (line == NULL)
return NULL;

if (PyObject_Size(line) == 0) {
Py_DECREF(line);
return NULL;
}

return line;
}

open 返回的文件对象,并为 sys.stdout 之类的东西自动创建,以及大多数或所有在 stdlib 中其他任何地方创建的文件对象( GzipFile 等)是 TextIOWrapper 的实例(对于文本文件),或 BufferedRandomBufferedReaderBufferedWriter(对于二进制文件),它们都从 IOBase 继承此行为。没有什么可以阻止不同的文件类覆盖 __iter__(或将 IOBase 注册为 ABC 而不是继承它),但我不知道有什么可以做到的。

关于python - 文件是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30792658/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com