2016-07-29 342 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