2015-06-11 61 views
3

我很好奇文件如何在Python中工作。文件是如何實現的,使其能夠通過這樣的循環:文件如何實現?

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

目前尚不清楚哪些部分你不明白。你對定製'for'循環的行爲是如何工作的感到困惑嗎?還是你想知道它如何找到行結束?或者是其他東西?如果你想知道實現是如何工作的,最可靠的方法是[讀取實現](https://hg.python.org/cpython/file/d77db57982a1/Objects/fileobject.c);這可能超出了你的背景知識水平,但你可能能夠弄清楚一些事情。 – user2357112

+0

@ user2357112我相信他在問如何遍歷文件對象。 – Scott

+1

@Scott是的,這就是我要問的。 – Aaron

回答

6

如果您使用的是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(對於文本文件)或BufferedRandomBufferedReaderBufferedWriter(對於二進制文件)的實例,它們都從IOBase繼承此行爲。沒有什麼能夠阻止一個不同的文件類別覆蓋__iter__(或者將IOBase註冊爲ABC而不是繼承它),但是我不知道這樣做。

3

對於Python 2 ...

  • 如何打開的文件docs ...

    文件對象是使用C的stdio包實現的,可以使用內置的open()函數創建的 。

  • 一個文件對象是它自己的迭代器docs

    一個文件對象是自己的迭代器,例如ITER(F)返回˚F (除非f爲關閉)。當文件被用作迭代器時,通常在for循環中(例如,用於f:print line.strip()中的行),將重複調用next()方法。

  • 如何在一個文件對象可迭代產生由由函數指定open()換行符產生的迭代器。 Python默認會識別新行格式的a number