簡體   English   中英

glob.iglob 結果按名稱排序?

[英]glob.iglob results ordered by name?

我需要遍歷一個可能非常大的目錄(任意大)。 據我了解,常規glob.glob函數在內存中存儲所有匹配文件名的列表,但glob.iglob函數使用迭代器。 所以使用常規的glob.glob函數是glob.glob的,因為目錄中可能有很多文件。

我的問題是iglob以看似隨機的順序遍歷目錄。 我希望它按字母順序遍歷文件。 我無法一次獲得所有文件名的列表,只能對它們進行排序,所以我想知道是否有辦法讓iglob按字母順序遍歷目錄。

不,沒有,不是沒有將目錄的所有內容讀入內存。 操作系統按目錄順序提供文件名,如果要對這些內容進行排序,也需要將內容完整讀入內存。

您可以在iglob()匹配文件后對結果進行排序,前提是該集合足夠小,可以通過在iglob()輸出上調用sorted()來裝入內存:

for filename in sorted(iglob(path)):

請注意,當不遞歸到子目錄時, iglob()已經將單個目錄的所有條目加載到列表中(部分原因是fnmatch()返回一個列表)。

glob模塊的文檔

glob模塊根據 Unix shell 使用的規則查找與指定模式匹配的所有路徑名。 沒有進行波浪號擴展,但是* , ? , 用[]表示的字符范圍將被正確匹配。 這是通過同時使用os.listdir()fnmatch.fnmatch()函數來完成的,而不是通過實際調用子shell來完成的。

如果我們查看os.listdir的文檔:

os.listdir(路徑)

返回一個包含路徑給定目錄中條目名稱的列表。 該列表的順序是任意的 它不包括特殊條目“.” 和 '..' 即使它們存在於目錄中。

所以glob.glob不會按字母順序返回文件。 它沒有在文檔中的任何地方說明。 依賴這種行為是一個錯誤。 如果你想要一個有序的序列,你必須對結果進行排序。 然后你可以很容易地想象,沒有辦法讓iglob返回一個排序的結果,因為它甚至沒有所有可用的結果。

如果內存確實是個問題,那么您有兩種選擇:

  1. 刪除“aplhabetical order”要求,只使用iglob
  2. 使用某種“桶排序”對數據進行排序,將大部分數據保留在磁盤上並將其分塊加載到 RAM 中(此類技術在計算機編程藝術,第 3 冊中進行了解釋)。 這種方法會使您的程序變慢並且可能更難編寫。 但是,如果您真的無法將所有文件名保存在 RAM 中,那么您最終必須將它們保存在磁盤上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM