如何实施文件?

时间:2015-06-11 22:42:53

标签: python

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

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

3 个答案:

答案 0 :(得分:8)

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

如果您正在使用Python 3,那么io模块中的所有内容都会非常详细地记录下来,并且stdlib中的所有内容都具有合理可读的pure Python implementation,所有内容都不再构建而不是一个非常简单的"原始文件"接口(FileIO在Unix上的POSIX本机文件描述符之上实现。)

IOBase ABC / mixin根据__iter__方法提供readline方法:

  

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

如果你看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注册而不是继承它),但我不知道有任何文件类。< / p>

答案 1 :(得分:4)

对于Python 2 ...

  • 如何打开文件docs ...

      

    文件对象使用C的stdio包实现,可以   使用内置的open()函数创建。

  • 来自docs的文件对象是自己的迭代器

      

    文件对象是它自己的迭代器,例如iter(f)返回f   (除非f关闭)。当文件用作迭代器时,通常在   一个for循环(例如,对于f中的行:print line.strip()),.   重复调用next()方法。

  • 如何生成文件对象中的iterable 迭代器由函数open()指定的换行符生成。默认情况下,Python会识别新行格式的a number

答案 2 :(得分:2)

它实现了iterable接口,并在file.readline()方法的每次迭代/调用时调用next()方法。