我很好奇文件如何在python中运行。如何实现文件,以便能够像这样循环:
csv_file = open("filename.csv", "r")
for line in csv_file:
# do something with line
答案 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
(对于文本文件)或BufferedRandom
,BufferedReader
或BufferedWriter
(对于二进制文件)的实例,它们都从IOBase
继承此行为。没有什么可以阻止不同的文件类覆盖__iter__
(或者使用IOBase
作为ABC注册而不是继承它),但我不知道有任何文件类。< / p>
答案 1 :(得分:4)
对于Python 2 ...
答案 2 :(得分:2)
它实现了iterable
接口,并在file.readline()
方法的每次迭代/调用时调用next()
方法。