循环不执行主要功能

时间:2012-07-06 14:28:15

标签: python

我正在尝试编写一个Python脚本,该脚本使用属于我所在公司的特定外部应用程序。在编程和编写脚本时,我通常可以自己解决问题,但这次我真的迷失了!

我似乎无法弄清楚为什么while循环不会像它的意图那样起作用。它没有给出任何对我没有帮助的错误。它似乎跳过循环中心的代码的重要部分,然后继续增加“计数”,就像之后应该的那样!

f = open('C:/tmp/tmp1.txt', 'w')    #Create a tempory textfile
f.write("TEXTFILE\nTEXTFILE\nTEXTFILE\nTEXTFILE\nTEXTFILE\nTEXTFILE\n") #Put some simple text in there
f.close()   #Close the file

count = 0   #Insert the line number from the text file you want to begin with (first line starts with 0)
num_lines = sum(1 for line1 in open('C:/tmp/tmp1.txt')) #Get the number of lines from the textfile

f = open('C:/tmp/tmp2.txt', 'w')    #Create a new textfile
f.close()   #Close it

while (count < num_lines):  #Keep the loop within the starting line and total number of lines from the first text file
    with open('C:/tmp/tmp1.txt', 'r') as f: #Open the first textfile
        line2 = f.readlines()   #Read these lines for later input
        for line2[count] in f:  #For each line from chosen starting line until last line from first text file,...
            with open('C:/tmp/tmp2.txt', 'a') as g: #...with the second textfile open for appending strings,...
                g.write("hello\n")  #...write 'hello\n' each time while "count" < "num_lines"
    count = count + 1   #Increment the "count"

我认为一切正常,直到:“对于f中的line2 [count]:”

我正在处理的实际代码有点复杂,而我正在使用的应用程序并不完全用于共享,因此我简化了代码以提供愚蠢的输出,而不仅仅是为了解决问题。

我不是在寻找替代代码,我只是在寻找循环不起作用的原因,所以我可以尝试自己修复它。

所有答案都将受到赞赏,并提前感谢所有人!

科马克

3 个答案:

答案 0 :(得分:2)

一些意见:

num_lines = sum(1 for line1 in open('C:/tmp/tmp1.txt'))

为什么呢? len(open(filename, 'rb').readlines())出了什么问题?

while (count < num_lines):
    ...
    count = count + 1

这是糟糕的风格,您可以使用:

for i in range(num_lines):
    ...

请注意,我将您的索引命名为i,这是普遍认可的,并且我使用了rangefor循环。

现在,您的问题,就像我在评论中所说的那样,f是一个文件(即带有位置指针的字节流),并且您已经读取了它的所有行。所以,当你执行for line2[count] in f:时,它会尝试在line2[count]中读取一行(这有点奇怪,实际上,你几乎从不使用for循环将列表成员作为索引但是显然你可以这样做),看到没有行可读,并且永远不会执行循环中的内容。

无论如何,您想要从给定的行号开始逐行读取文件?这是一个更好的方法:

from itertools import islice

start_line = 0 # change this
filename = "foobar" # also this

with open(filename, 'rb') as f:
    for line in islice(f, start_line, None):
        print(line)

我意识到你不需要替代代码,但你的代码确实是不必要的复杂。

答案 1 :(得分:0)

如果你想迭代文件f中的行,我建议用

替换你的“for”行
for line in line2:
    # do something with "line"...

您将这些行放在名为line2的数组中,因此请使用该数组!使用line2 [count]作为循环变量对我来说没有意义。

答案 2 :(得分:0)

你似乎弄错了'for line in f'循环是如何工作的。它遍历文件并调用readline,直到没有要读取的行。但是在你开始循环的那一刻,所有行都已经被读取(通过f.readlines())并且文件的当前位置已经结束。你可以通过调用f.seek(0)来实现你想要的东西,但是这似乎不是一个好的决定,因为你将再次读取文件并且那是缓慢的IO。 相反,你想做像:

for line in line2[count:]: # iterate over lines read, starting with `count` line
    do_smth_with(line)