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