[英]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
返回一個排序的結果,因為它甚至沒有所有可用的結果。
如果內存確實是個問題,那么您有兩種選擇:
iglob
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.