2017-06-15 72 views
1

我試圖循環瀏覽擴展名爲.jpg.jpeg的文件夾中的文件。這看起來應該起作用,但由於某種原因,沒有任何打印。當我運行它時,沒有編譯錯誤,它只是不會將任何內容打印到Python控制檯。列出文件夾中的文件 - 無輸出顯示

import os 

def find_images(image_dir, extensions=None): 
    default_extensions = ('jpg', 'jpeg') 
    if extensions is None: 
     extensions = default_extensions 
    elif isinstance(extensions, str): 
     extensions = (extensions,) 
    for root, dirs, filenames in os.walk(image_dir): 
     for filename in filenames: 
      print(filename, filename.split('.',1)) 
      if filename.split('.', 1)[-1].lower() in extensions: 
       yield os.path.join(root, filename) 


def main(image_dir=None): 
    if image_dir is None: 
     image_dir="D:/userName/Pictures/Gotham" 
    find_images(image_dir) 

main() #doesn't return anything in console 
find_images("D:/userName/Pictures/Gotham",) # also doesn't do anything... 

所有我試圖找到問題在線給這樣(通過文件循環目錄中)的方法,但沒有什麼是我展示如何正確使用的路徑,因爲那是什麼我覺得我做得不對。 這個文件夾中的圖片,我似乎無法看出爲什麼腳本沒有列出每個文件的名稱。

我也試過image_dir=r'D:\userName\Pictures\Gotham'...='D://userName//Pictures//Gotham'無濟於事。

編輯:意在添加此。這沒有工作

file_path = "D:/userName/Pictures/" 
def list_images(): 
    for root, dirs, files in os.walk(file_path): 
     for file in files: 
      if file.endswith(".jpg"): 
       print(file, file.split('.',1)) 

list_images() 

...所以我是什麼在上面find_images(...)俯瞰?

(僅供參考 - 我試圖實現從this answer東西)

+0

如果你打印出來,你會得到什麼:'os.path.isdir(r「D:\ userName \ Pictures \ Gotham」)'? – zwer

+0

@zwer - 同樣的事情。雖然看到我的編輯,但這很奇怪......即使在'find_images'中,如果我創建第一行*'image_dir = file_path',則什麼都不會發生。即使打印(「嗨」),也沒有打印。 ... – BruceWayne

回答

2

我沒有注意到你的函數偷偷摸摸yield ...嗯,你已經做出了發電機功能,所以它只是返回一個迭代器時你怎麼稱呼它 - 把它真正開始執行,你必須開始通過它迭代:

for image in find_images("D:/userName/Pictures/Gotham"): 
    print(image) 

,或者至少拿到的第一個元素來啓動它:

first_result = next(find_images("D:/userName/Pictures/Gotham")) 

另外,雖然我在這裏,但這是非常不安全的方式來檢查擴展名 - 如果文件名有多個點(即my.image.jpg)它不會被識別。使用str.endswith()或從字符串後面切片,而不是str.split()(或不限制拆分爲1)。

+0

哦,夥計!而已!我想知道爲什麼在'main()'(在我連接的答案中)是這樣設置的。這很有道理,並且實際上教會了我比我懷疑「簡單」功能更多的方式。我還在學習,但這很好,謝謝你!編輯:根據你的編輯,什麼是更安全的方式? '如果擴展名中的文件[-4:]:'更好? – BruceWayne

+1

一個忠告,tho - 不要使用生成器遍歷文件列表,如果該文件仍然存在(例如,一旦它傳遞了擴展檢查),至少使用'os.path.isfile(os.path .join(root,filename))'在將路徑返回給調用者之前 - os.walk()將有一個緩存的文件列表,而不是當前狀態(您的生成器可以等待幾個小時),所以可能會發生這種情況當您的生成器到達該文件時,該文件就消失了。如果您的磁盤上存在狀態更改的可能性,那麼現場檢查您的文件更爲安全。 – zwer

+1

@BruceWayne - 只有當你的所有擴展名都是三個字母時,它纔會起作用,否則你必須考慮不同的長度。有一個專門的函數將文件名分割成基本名和擴展名:['os.path.splitext()'](https://docs.python.org/3/library/os.path.html#os.path 。splitext),但是你可以通過右分割實現:*擴展名中的filename.rsplit(「。」,1)[1],但這是不安全的 - 如果遇到的文件名中沒有點,它會引發一個IndexError '。 – zwer