我刚开始使用 Python,并且由于我的背景是更多低级语言(java、C++),所以我真的无法掌握一些东西。
因此,在 python 中,可以创建一个文件变量,例如,通过打开一个文本文件,然后像这样遍历它的行:
f = open(sys.argv[1])
for line in f:
#do something
但是,如果我尝试 f[0]
,解释器会给出错误。那么 f
对象有什么结构,我怎么知道一般情况下,如果我可以将 for ... in ... :
循环应用于对象?
最佳答案
f
是一个 file object .文档列出了它的结构,所以我只解释索引/迭代行为。
只有实现了 __getitem__
的对象才可索引,您可以通过调用 hasattr(f, '__getitem__')
或仅调用 f[0 ]
并查看它是否抛出错误。事实上,这正是您的错误消息告诉您的内容:
TypeError: 'file' object has no attribute '__getitem__'
文件对象不可索引。您可以调用 f.readlines()
并返回一个行列表,它本身是可索引的。
实现 __iter__
的对象可以使用 for ... in ...
语法进行迭代。现在实际上有两种类型的可迭代对象:容器对象和迭代器对象。迭代器对象实现了两个方法:__iter__
和 __next__
。容器对象仅实现 __iter__
并返回一个迭代器对象,这实际上是您要迭代的对象。文件对象是它们自己的迭代器,因为它们实现了这两种方法。
如果你想获取一个可迭代对象中的下一项,你可以使用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'))
请注意:可迭代对象通常不是“可回绕的”,因此一旦您在可迭代对象中取得进展,就无法真正返回。要“倒回”文件对象,您可以使用 f.seek(0)
,它将当前位置设置回文件的开头。
关于Python 文件变量——它是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16637518/