如何实施文件?

Aar*_*ron 4 python

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

csv_file = open("filename.csv", "r")
for line in csv_file:
    # do something with line
Run Code Online (Sandbox Code Playgroud)

aba*_*ert 9

如果您使用的是Python 2,则细节有点模糊; alexmcf的答案涵盖了基础知识,您可以从那里查找更多详细信息.

如果您使用的是Python 3,那么io模块中的所有内容都会非常详细地记录下来,并且在stdlib中提供了一个相当可读的纯Python实现,所有这些实现都只是一个非常简单的"原始文件"接口(它FileIO实现了)在Unix上的POSIX本机文件描述符之上).

的IOBaseABC /混入提供了一种__iter__基于该方法readline的方法:

IOBase(及其子类)支持迭代器协议,这意味着IOBase可以迭代对象,从而产生流中的行.根据流是二进制流(产生字节)还是文本流(产生字符串),行的定义略有不同.见readline()下文.

如果您查看3.5源代码,它就像您期望的那样简单:

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

def __next__(self):
    line = self.readline()
    if not line:
        raise StopIteration
    return line
Run Code Online (Sandbox Code Playgroud)

当然在CPython 3.1+中,如果可能的话,有一个C加速器代替Python代码,但看起来非常相似:

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;
}
Run Code Online (Sandbox Code Playgroud)

该文件对象返回的open,而对于像自动创建的sys.stdout,并且大部分或全部文件对象在STDLIB创建其他地方(GzipFile等),都是实例TextIOWrapper(文本文件),或BufferedRandom,BufferedReader或BufferedWriter(二进制文件),所有都继承了这种行为IOBase.没有什么可以阻止不同的文件类覆盖__iter__(或者IOBase作为ABC 注册而不是继承它),但我不知道有什么用.