Python 文件变量——它是什么?

标签 python file for-loop

我刚开始使用 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/

相关文章:

javascript - 如何在 0(零)处启动 javascript 'for of' 循环?

python - 如何升级django?

python - 如何更改 matplotlib 中阴影线的线宽?

java - 从 Android 编写的文本文件中读取数值

c++ - for 循环在 if 条件下

css - 有效地迭代视网膜和非视网膜图像的 sass 变量列表

python - 如何在 docker 中安装 lxml

python - 如何从脚本/模块 __main__ 启动 Celery worker?

file - 如何在 Linux 上通过脚本找到文件的编码?

java - 如何从java中的文件中读取每隔两行