2015-10-13 78 views
1

在遍历文本文件和列表上的迭代期间,我发现了for循环的意外行为。 文本文件test.txt只由两个字符串组成:1)He said:和2)We said:。 首先for + forPython不等于'迭代'

file_ = open('c:\\Python27\\test.txt', 'r') 
list_ = ['Alpha','Bravo','Charlie'] 
try: 
    for string in file_: 
     for element in list_: 
      print string, element 
except StandardError: 
    print 'Ooops' 

回报绝对预见的结果是:

He said: Alpha 
He said: Bravo 
He said: Charlie 
We said: Alpha 
We said: Bravo 
We said: Charlie 

但是如果for顺序改变为

file_ = open('c:\\Python27\\test.txt', 'r') 
list_ = ['Alpha','Bravo','Charlie'] 
try: 
    for element in list_: 
     for string in file_: 
      print string, element 
except StandardError: 
    print 'Ooops' 

结果是完全不同的:

He said: Alpha 
We said: Alpha 

看起来像第一个for变得不可战胜。为什么?

+0

是所有的代码? – Onilol

+0

'lines = file.readlines()'然后只是在'lines'列表中进行迭代。 –

+0

[davidism](http://stackoverflow.com/users/400617/davidism), 感谢您的评论。前期问题非常紧密,但对我而言,它有一点不同。 –

回答

3

当您完成对文件的for循环时,您“消耗”它。您将不得不回到file_.seek(0)的外循环迭代开始。或者使用原始的循环顺序。

你可以用这个简单的例子复制的行为:

for string in file_: 
     print string 

    for string in file_: 
     print string 

在那里你会看到第二个循环什么都不做。

+0

谢谢,这是非常有力的例子 –

2

您需要使用file_.seek(0)才能返回到文件的开头,以重新遍历其内容。

你已经通过它通过迭代:for string in file_:,因此当前位置,通过调用file_.tell()获得,将在字节文件的大小(如果我没有记错的话),标志着结束。