加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 如何实现文件?

发布时间:2020-12-20 12:08:20 所属栏目:Python 来源:网络整理
导读:我很好奇文件如何在 python中工作.如何实现文件,以便它能够像这样循环: csv_file = open("filename.csv","r")for line in csv_file: # do something with line 解决方法 如果您使用的是Python 2,则细节有点模糊; alexmcf’s answer涵盖了基础知识,您可以从
我很好奇文件如何在 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 / mixin基于readline方法提供__iter__方法:

IOBase (and its subclasses) supports the iterator protocol,meaning that an IOBase object can be iterated over yielding the lines in a stream. Lines are defined slightly differently depending on whether the stream is a binary stream (yielding bytes),or a text stream (yielding character strings). See readline() below.

如果你看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而不是继承它),但我不知道有什么用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读