2016-07-29 344 views
-1

我试图从几个文件建立输入列表。我需要列表仅包含具有给定基本名称的第一个文件。所以如果我& 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中。while while循环无限

我设置了一个条件来计算文件,一旦它的基名在列表中找到。一旦计数= 1,它将退出while循环,将计数值重置为0,并转到列表中的下一个名称,仅将文件名的第一个实例添加到新的输入列表中。我的代码似乎继续运行,所以我想我有一个内部的循环,但我想设置计数为0以外while循环会防止这种情况:

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

是的。在您发表评论之前对其进行编辑。不过谢谢。 – ShaunO

+0

是的,如果任何文件没有你要找的文件名,这个while循环是无限的。 ''文件'在'while循环中永远不会改变,所以如果条件不是最初,条件永远不会变为真。 –

+0

你觉得'os.path.basename'有什么作用? –

回答

1

while循环将是无限的,因为它只实现了退出条件如果os.path.basename(file) == name+".dbf"返回True。如果不是这样,那么计数将永远不会更新,并且循环将一遍又一遍地执行相同的条件检查。

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

所以,你根本不需要那个while循环。您只是想检查您的fileLst对象中的每个文件是否与您正在查找的文件名相同,因此只需遍历fileLst即可。

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

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) 
+0

中的file1.ext,但是不会将具有相同基本名称的后续文件添加到列表中吗? – ShaunO

+0

'break'意味着内部的'for'循环立即结束,所以它将继续下一次迭代'dbfOnlyLst'中的名字。 – xgord

+0

啊,我想中断会退出整个循环。我会给它一个镜头。 – ShaunO

0

上移动到下一个name我知道它在评论被提及,但我想我会证明它。 您的循环一直持续到x不再小于1.这只发生在找到带有“.dbf”的文件时,因为这会导致x + = 1。如果没有找到带有“.dbf”的文件,循环将继续运行。

例如...

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循环。我回答了这个问题,这样你就可以看到“幕后”发生了什么。我希望这有助于

+0

明白了。我真的没有想到这个问题没有被视为一个可能的问题。谢谢! – ShaunO

+0

没问题。有第二组眼睛看东西可能会非常有帮助。我希望我能帮上忙 – Justlieb