Python文件变量 - 它是什么?

cof*_*fee 3 python for-loop file

我刚开始使用Python,由于我的背景是更低级的语言(java,C++),我真的无法得到一些东西.

因此,在python中,例如,可以通过打开文本文件来创建文件变量,然后迭代它的行,如下所示:

f = open(sys.argv[1])
for line in f:
    #do something
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试f[0]解释器给出错误.那么f对象具有什么样的结构for ... in ... :?如果我可以将循环应用于对象,我通常如何知道?

Ble*_*der 7

f是一个文件对象.文档列出了它的结构,所以我只解释索引/迭代行为.

对象只有在实现时才可索引__getitem__,您可以通过调用hasattr(f, '__getitem__')或仅调用f[0]并查看是否抛出错误来检查对象.事实上,这正是您的错误消息告诉您的:

TypeError: 'file' object has no attribute '__getitem__'
Run Code Online (Sandbox Code Playgroud)

文件对象不可索引.您可以调用f.readlines()并返回一个行列表,这些行本身是可索引的.

实现的对象可以__iter__使用for ... in ...语法进行迭代.现在实际上有两种类型的可迭代对象:容器对象和迭代器对象.Iterator对象实现两种方法:__iter____next__.容器对象只实现__iter__并返回一个迭代器对象,这实际上就是你要迭代的东西.文件对象是它们自己的迭代器,因为它们实现了两种方法.

如果要获取iterable中的下一个项目,可以使用以下next()函数:

first_line = next(f)
second_line = next(f)
next_line_that_starts_with_0 = next(line for line in f if line.startswith('0'))
Run Code Online (Sandbox Code Playgroud)

需要注意的一点是:迭代通常不是"可重绕的",所以一旦你完成了迭代,你就无法回头了.要" f.seek(0)回放"文件对象,您可以使用,它将当前位置设置回文件的开头.