python如何从文件中读取行

时间:2013-08-02 10:24:25

标签: python

考虑以下简单的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是一个列表。所以第二个循环将迭代列表元素。

2 个答案:

答案 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。