0

我正在尝试编写一个 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"

我认为一切正常,直到:“for line2[count] in f:”

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

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

所有答案将不胜感激,并提前感谢大家!

科马克

4

3 回答 3

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):
    ...

请注意,我将您的 index 命名i为普遍认可的名称,并且我使用range了一个for循环。

现在,就像我在评论中所说的那样,您的问题是这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)

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

于 2012-07-06T14:49:38.110 回答
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)
于 2012-07-06T14:48:16.613 回答
0

如果您想遍历文件 f 中的行,我建议将您的“for”行替换为

for line in line2:
    # do something with "line"...

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

于 2012-07-06T14:41:59.027 回答