Python文件变量-这是什么?
问题内容:
我刚开始使用Python,并且由于我的背景是使用更底层的语言(java,C ++),所以我真的无法获得一些东西。
因此,在python中,您可以创建一个文件变量,例如,通过打开一个文本文件,然后像下面这样遍历其行:
f = open(sys.argv[1])
for line in f:
#do something
但是,如果我尝试f[0]
解释器给出错误。那么f
,如果我可以将for ... in ... :
循环应用于对象,则对象具有什么结构?我一般如何知道?
问题答案:
f
是文件对象。该文档列出了其结构,因此,我仅说明索引/迭代行为。
对象只有在实现时才可索引__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)
,它将把当前位置设置回文件的开头。