Python 当循环不执行主功能时

Python 当循环不执行主功能时,python,Python,我正在尝试编写一个Python脚本,它使用属于我工作的公司的特定外部应用程序。当涉及到编程和脚本时,我通常可以自己解决问题,但这次我真的迷路了 我似乎不明白为什么while循环不能正常工作。它没有给出任何对我没有帮助的错误。它似乎只是跳过了循环中心代码的重要部分,然后继续增加“计数”,就像它之后应该做的那样 f = open('C:/tmp/tmp1.txt', 'w') #Create a tempory textfile f.write("TEXTFILE\nTEXTFILE\nTEX

我正在尝试编写一个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=open('C:/tmp/tmp1.txt','w')#创建一个临时文本文件
f、 写(“TEXTFILE\nTEXTFILE\nTEXTFILE\nTEXTFILE\nTEXTFILE\nTEXTFILE\n”)#在那里放一些简单的文本
f、 close()#关闭文件
count=0#从文本文件中插入行号(第一行以0开头)
num_lines=sum(打开('C:/tmp/tmp1.txt')中的第1行为1)#从文本文件中获取行数
f=open('C:/tmp/tmp2.txt','w')#创建一个新的文本文件
f、 合上()
while(count
我想一切都会好起来,直到:“对于f中的第2行[计数]:

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

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

所有答案都将被感谢,并提前感谢大家


Cormac

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

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

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

您似乎弄错了“for line in f”循环的工作方式。它迭代一个文件并调用readline,直到没有要读取的行为止。但在启动循环的那一刻,所有的行都已被读取(通过f.readlines()),文件的当前位置在末尾。您可以通过调用f.seek(0)来实现所需的功能,但无论如何,这似乎不是一个好的决定,因为您将再次读取文件,这是一个缓慢的IO。 相反,您希望执行smth,如:

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

num_lines = sum(1 for line1 in open('C:/tmp/tmp1.txt'))
为什么??
len(open(filename,'rb').readlines()有什么问题?

请注意,我将您的索引命名为
I
,这是公认的,并且我使用了
range
作为循环

现在,正如我在评论中所说,您的问题是
f
是一个文件(即,一个带有位置指针的字节流),您已经从中读取了所有行。因此,当您在f:
中对line2[count]执行
操作时,它会尝试将一行读取到
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)

我知道您不需要其他代码,但您的代码确实是不必要的复杂。

是否允许您对f:
中的[count]行使用
?你试过f:
中的
行吗?嗯。您的问题是,在执行
readlines()
调用后,
f
没有更多的行可读,因此它在
line2[count]
中放置了一个
None
(与之前的情况相比)。这可能与在f
中使用
line2[count]有关。如果您创建line2,您应该对line2:
中的line使用
。有趣的是,我不知道您可以对in:
这样的语法使用
。虽然这看起来可能比它的价值更麻烦。谢谢我刚刚更改了上面的代码,我认为它现在的工作方式是它的本意。现在我必须看看我是否能修复真正的代码。再次感谢大家!谢谢你的回答!我之所以不要求其他代码,是因为我喜欢用艰苦的方式学习。这样我知道,当我自己弄明白一些事情时,我会更好地理解它,而且我可能永远记得如何再做一次。但我喜欢你给我的是“小”的选择,而不是一个大的选择。这样我就可以慢慢来,进一步调查。谢谢“rb”正在读取二进制文件吗?这会使代码更高效吗?@FCormacB:
b
确实是二进制的缩写,但是在FTP
binary
ASCII
命令的意义上。如果没有它,Windows上的Python在读写文件时将在
\r\n
\n
之间转换。我通常不喜欢隐式修改我的文件,所以我在打开文件时使用
b
。短版本——它对效率没有任何作用,但对于二进制文件(JPEG、MP3,…),它对正确性很重要。@FCormacB:Reference:@FCormacB:顺便说一句,如果你复习代码,我应该解释一下我在常规
slice
行中使用
islice
的基本原理[开始行:
语法。其他选项返回一个
列表
对象,这意味着它们实际上包含所有行。这意味着您需要将整个文件保存在内存中,这将导致
for i in range(num_lines):
    ...
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)