是循环无限的

时间:2016-07-29 17:58:42

标签: python while-loop

我试图从几个文件构建输入列表。我需要列表只包含具有给定基名的第一个文件。所以如果我是& b是文件夹,有" C:\ a \ file1.ext"," C:\ b \ file1"和" C:\ c \ file1"我有一个名称file1,file2等列表,我希望脚本在C:\ a \ file1.ext中找到file1,然后转到列表中的下一个名称。在某些情况下,file-x.ext可能不在C:\ a或C:\ c或C:\ b中。

我设置了一个条件,一旦在列表中找到它的基本名称就对文件进行计数。一旦count = 1,它就会退出while循环,将计数重置为0,然后转到列表中的下一个名称,只将文件名的第一个实例添加到新的输入列表中。我的代码似乎继续运行所以我认为我有一个内部循环,但我认为在while循环之外将count设置为0会阻止这个:

count = 0
for name in dbfOnlyLst:
    for file in fileLst:
        while count < 1:
            if  os.path.basename(file) == name+".dbf":
                values.add(file)
                count += 1
    count = 0
inList = list(values)

2 个答案:

答案 0 :(得分:1)

你的while循环将是无限的,因为只有当os.path.basename(file) == name+".dbf"返回True时才会达到退出条件。如果它不是真的,则count将永远不会更新,并且循环将反复执行相同的条件检查。

os.path.basename(file)只返回没有路径的文件名 - 它不会继续查看列表中的下一个文件,因此没有理由为什么多次执行该检查会做任何事情不同。

因此,您根本不需要while循环。您只是想检查fileLst对象中的每个文件是否等于您要查找的文件名,因此只需迭代fileLst即可。

由于您只想记录基本文件名的第一个匹配项,因此只要找到匹配项,就可以使用break关键字提前退出内部循环。这样您就不会继续迭代fileLst并继续name

中的下一个dbfOnlyLst
for name in dbfOnlyLst:
    for file in fileLst:
        if  os.path.basename(file) == name+".dbf":
            values.add(file)
            break # only add the first match
inList = list(values)

答案 1 :(得分:0)

我知道评论中已经提到过,但我想我会证明这一点。 你的循环一直持续到x不再小于1.只有当找到一个带有&#34; .dbf&#34;的文件时才会发生这种情况。在其中,因为这导致x + = 1.如果文件带有&#34; .dbf&#34;找不到,循环将继续运行。

例如......

count = 0
x = 12  # my imitation of finding a file with .dbf in it
while count < 1:
    if x == 12:
        print("yes")
        x += 1

... 'yes'

这是循环结束的时候。但是,如果x不等于12 ......

count = 0
x = 8
while count < 1:
    if x == 12:
        print("yes")
        x += 1
    else:
        print("no")  # will show you are stuck in the loop

... 'no'
... 'no'
... 'no'
... 'no'
# And so on...

我会建议@xgord避免使用while循环。我回答了这个问题,所以你可以看到后面发生了什么&#34;在幕后&#34;。我希望这有帮助