我正在尝试编写一个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]:”
我正在处理的实际代码有点复杂,而我正在使用的应用程序并不完全用于共享,因此我简化了代码以提供愚蠢的输出,而不仅仅是为了解决问题。
我不是在寻找替代代码,我只是在寻找循环不起作用的原因,所以我可以尝试自己修复它。
所有答案都将受到赞赏,并提前感谢所有人!
科马克
答案 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
,这是普遍认可的,并且我使用了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)
我意识到你不需要替代代码,但你的代码确实是不必要的复杂。
答案 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)