2014-02-12 40 views
6

我有大量的文件,我想通過使用python遍歷。我使用的是os.walk(源代碼),並且工作正常,但是由於我擁有大量文件,因爲它一次獲取完整列表,因此佔用了太多內存資源。我怎樣才能優化這個使用更少的資源,並且一次或者以其他有效的方式遍歷一個目錄,並且仍然能夠遍歷整套文件。由於Python - 通過一個巨大的文件集,但以更高效的方式步行

for dir, dirnames, filenames in os.walk(START_FOLDER): 
    for name in dirnames: 
     #if PRIVATE_FOLDER not in name: 
      for keyword in FOLDER_WITH_KEYWORDS_DELETION_EXCEPTION_LIST: 
       if keyword in name.lower(): 
        ignoreList.append(name) 
+6

'os.walk'已經返回一個懶惰的生成器。你是把它變成一個清單什麼的?因爲如果沒有,它不應該導致內存問題。 (另外,發佈您的代碼。) – senshin

+0

我想通過每個文件名,如果包含某些關鍵字我想將它們添加到os.walk(START_FOLDER)中的目錄,dirnames,文件名列表中: dirnames中:#如果 不PRIVATE_FOLDER在名稱: 在FOLDER_WITH_KEYWORDS_DELETION_EXCEPTION_LIST關鍵字: 如果name.lower關鍵字(): ignoreList.append(名稱) – nirvana

+0

好。發佈你的代碼,這樣做。 – senshin

回答

2

你應該利用in關鍵字來測試,如果目錄名稱的關鍵字匹配。

for _, dirnames, _ in os.walk(START_FOLDER): 
    for name in dirnames: 
     if any((k in name.lower() for k in FOLDER_WITH_KEYWORDS_DELETION_EXCEPTION_LIST)): 
      ignoreList.append(name) 

如果您ignoreList太大,你可能要考慮有關創建acceptedList和使用代替。

+0

現在它需要python 3,因爲OP沒有標記2.x或3.x,所以應該提到它。 – GVH

+0

@GVH不兼容p3k的是什麼? – Levi

+0

你不應該在三元if表達式中使用'True'和'False'。 '如果x in y else False'與'x in y'相同則爲真。其次,你仍然混淆了OP的測試。 OP檢查任何關鍵字是否是該名稱的子字符串;而不是該名稱是否是任何關鍵字的子字符串。 –

3

如果問題是該目錄只有too many files in it,這將有望在Python 3.5中解決。

在此之前,您可能需要檢出scandir

+1

是的,[os.scandir()](https://docs.python.org/3.5/library/os.html#os.scandir)被添加到Python 3.5並返回一個生成器,該生成器生成簡單的[os.DirEntry] (https://docs.python.org/3.5/library/os.html#os.DirEntry)包含文件路徑和其他文件屬性的對象。 – David

相關問題