考虑以下简单的 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 是一个列表。所以第二个循环将遍历列表元素。
考虑以下简单的 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 是一个列表。所以第二个循环将遍历列表元素。
Python 有一个称为“可迭代”的符号。它们知道如何让你遍历它们持有的一些数据。一些常见的迭代器是列表、集合、字典,几乎所有的数据结构。文件也不例外。
事情变得可迭代的方式是定义一个方法来返回一个带有next
方法的对象。此next
方法旨在重复调用并每次返回下一条数据。for foo in bar
循环实际上只是next
在幕后重复调用该方法。
对于文件,该next
方法返回行,就是这样。它不“知道”你想要线条,它总是会返回线条。原因是大约 50% 的涉及文件遍历的案例是按行进行的,如果你想要单词,
for word in (word for line in f for word in line.split(' ')):
...
工作得很好。
在 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 版中的新功能。