我试图从几个文件构建输入列表。我需要列表只包含具有给定基名的第一个文件。所以如果我是& 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)
答案 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;。我希望这有帮助