1

考虑以下简单的 python 代码:

f=open('raw1', 'r')
i=1
for line in f:
    line1=line.split()
    for word in line1:
        print word,
print '\n'

在第一个 for 循环中,即“for line in f:”,python 怎么知道我要读取一行而不是一个单词或一个字符?

第二个循环更清晰,因为 line1 是一个列表。所以第二个循环将遍历列表元素。

4

2 回答 2

4

Python 有一个称为“可迭代”的符号。它们知道如何让你遍历它们持有的一些数据。一些常见的迭代器是列表、集合、字典,几乎所有的数据结构。文件也不例外。

事情变得可迭代的方式是定义一个方法来返回一个带有next方法的对象。此next方法旨在重复调用并每次返回下一条数据。for foo in bar循环实际上只是next在幕后重复调用该方法。

对于文件,该next方法返回行,就是这样。它不“知道”你想要线条,它总是会返回线条。原因是大约 50% 的涉及文件遍历的案例是按行进行的,如果你想要单词,

 for word in (word for line in f for word in line.split(' ')):
     ...

工作得很好。

于 2013-08-02T10:34:00.023 回答
3

在 python 中,for..in语法用于可迭代对象(可以迭代的元素)。对于文件对象,迭代器就是文件本身。

在此处参考next()方法的文档- 摘录粘贴在下面:

文件对象是它自己的迭代器,例如 iter(f) 返回 f(除非 f 被关闭)。当文件用作迭代器时,通常在 for 循环中(例如,for line in f: print line),next() 方法会被重复调用。此方法返回下一个输入行,或在文件打开以供读取时遇到 EOF 时引发 StopIteration(当文件打开以供写入时,行为未定义)。为了使 for 循环成为循环文件行的最有效方式(一种非常常见的操作),next() 方法使用隐藏的预读缓冲区。作为使用预读缓冲区的结果,将 next() 与其他文件方法(如 readline())结合起来无法正常工作。但是,使用 seek() 将文件重新定位到绝对位置将刷新预读缓冲区。2.3 版中的新功能。

于 2013-08-02T10:29:17.490 回答