我很好奇文件如何在Python中工作。文件是如何實現的,使其能夠通過這樣的循環:文件如何實現?
csv_file = open("filename.csv", "r")
for line in csv_file:
# do something with line
我很好奇文件如何在Python中工作。文件是如何實現的,使其能夠通過這樣的循環:文件如何實現?
csv_file = open("filename.csv", "r")
for line in csv_file:
# do something with line
如果您使用的是Python 2,細節有點模糊; alexmcf's answer涵蓋了基本知識,您可以從那裏查找更多詳細信息。
如果你使用Python 3,一切都記錄在io
模塊的很詳細,並附帶在STDLIB相當可讀pure Python implementation,都建立在什麼上面不止一個非常簡單的「原始文件」界面(其中FileIO
在Unix上的POSIX本地文件描述符上實現)。
的IOBase
ABC /混入提供了一種基於readline
方法的__iter__
方法:
IOBase
(及其子類)支持迭代器協議,這意味着一個IOBase
對象可以在產生在一個行迭代流。根據流是二進制流(產生字節)還是文本流(產生字符串),行的定義略有不同。請參閱下面的readline()
。def __iter__(self): self._checkClosed() return self def __next__(self): line = self.readline() if not line: raise StopIteration return line
當然在CPython的3:
如果你看inside the 3.5 source,它作爲你希望它是這麼簡單。1+,還有這項工作到位的是Python代碼儘可能使用一個C加速器,但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而不是繼承它),但是我不知道這樣做。
它實現iterable
接口,並呼籲next()
方法的每次迭代/呼叫file.readline()
方法。
目前尚不清楚哪些部分你不明白。你對定製'for'循環的行爲是如何工作的感到困惑嗎?還是你想知道它如何找到行結束?或者是其他東西?如果你想知道實現是如何工作的,最可靠的方法是[讀取實現](https://hg.python.org/cpython/file/d77db57982a1/Objects/fileobject.c);這可能超出了你的背景知識水平,但你可能能夠弄清楚一些事情。 – user2357112
@ user2357112我相信他在問如何遍歷文件對象。 – Scott
@Scott是的,這就是我要問的。 – Aaron