考虑以下简单的python代码:
f=open('raw1', 'r')
i=1
for line in f:
line1=line.split()
for word in line1:
print word,
print '\n'
在第一个for循环中,“for f in line:”,python如何知道我想读一行而不是一个单词或一个字符?
第二个循环更清晰,因为line1是一个列表。所以第二个循环将迭代列表元素。
答案 0 :(得分:4)
Python有一个所谓的“迭代”的表示法。他们知道如何让你遍历他们持有的一些数据。一些常见的迭代器是列表,集合,dicts,几乎每个数据结构。文件也不例外。
事物变得可迭代的方式是定义一个方法来返回一个带有next
方法的对象。这个next
方法意味着重复调用,每次返回下一个数据。 for foo in bar
循环实际上只是在幕后重复调用next
方法。
对于文件,next
方法返回行,即它。它并不“知道”你想要线条,它总是会返回线条。原因是~50%涉及文件遍历的案例是按行的,如果你想要单词,
for word in (word for line in f for word in line.split(' ')):
...
工作正常。
答案 1 :(得分:3)
在python中, for..in 语法用于迭代(可以迭代的元素)。对于文件对象,迭代器就是文件本身。
请参阅here next()方法的文档 - 摘录于下方:
文件对象是它自己的迭代器,例如iter(f)返回f (除非f关闭)。当文件用作迭代器时,通常在 for循环(例如,对于f:print行中的行),next()方法 被反复调用。此方法返回下一个输入行,或 当文件打开以进行读取时,如果触发EOF,则会引发StopIteration (当文件打开以进行写入时,行为未定义)。为了 使for循环成为循环遍历a的最有效方式 file(一个非常常见的操作),next()方法使用隐藏 预读缓冲区。使用预读缓冲区的结果, 将next()与其他文件方法(如readline())相结合则不然 工作正常。但是,使用seek()将文件重新定位到 绝对位置将刷新预读缓冲区。新版本 2.3。