我很好奇文件如何在python中工作.如何实现文件,以便它能够像这样循环:
csv_file = open("filename.csv", "r")
for line in csv_file:
# do something with line
Run Code Online (Sandbox Code Playgroud)
如果您使用的是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 注册而不是继承它),但我不知道有什么用.
| 归档时间: |
|
| 查看次数: |
1118 次 |
| 最近记录: |