[英]Is os.listdir() deterministic?
從Python的文檔中, os.listdir()
返回
一個列表,其中包含由path給出的目錄中條目的名稱。 該列表是任意順序的。
我想知道的是,這個任意順序是否總是相同/確定性的? (如果文件夾的內容相同,則從一台計算機到另一台計算機,或者隨着時間的流逝)
編輯:我不是要使其具有確定性,也不是我想使用它。 我只是想知道(例如,訂單取決於什么?)
為了了解發生了什么,我們可以檢查python 3.2的基礎實現,可以在這里找到。
我們將重點介紹從2574行開始的POSIX部分。 在代碼中定義:
DIR *dirp; // will store the pointer to the directory
struct dirent *ep; // will store the pointer to the entry
有兩個重要的POSIX調用:第2596行的opendir
和第2611行的readdir
。
正如您可以從readdir
手冊頁中讀取的那樣:
readdir()函數返回一個指向dirent結構的指針,該結構表示dirp指向的目錄流中的下一個目錄條目。 在到達目錄流的末尾或發生錯誤時,它返回NULL。
因此, readdir
讀取目錄中的下一個條目,但是要由文件系統實現來定義next 。 您可以在此處閱讀有關此主題的更多信息:
[...]因為這是每個文件系統的事,所以即使同一目錄中創建的條目相同,遍歷順序對於同一系統上的不同目錄也可能不同,或者是因為目錄使用的目錄不同文件系統類型,或者僅僅是因為在不同的文件系統上設置了一些參數而已。
它可能取決於文件系統內部。 在典型的unix機器上,我希望os.listdir
返回值中的項順序與目錄“ dirent”數據結構中詳細信息的順序相同(這又取決於文件系統的詳細信息) )。
如果添加和刪除文件,我不希望目錄隨時間推移具有相同的順序。
我不希望兩台不同機器上的兩個“具有相同內容的目錄”具有一致的順序,除非在從一台計算機復制到另一台計算機時特別注意。
視各種具體情況而定,隨着時間的推移,順序可能會在一台計算機上更改,而不會對目錄進行任何顯式更改,因為會進行各種文件系統壓縮操作(盡管我認為我沒有看到過這樣的文件系統:實際上可以做到這一點,但這絕對是可以做到的)。
簡而言之,如果您想進行任何排序,就可以對結果進行排序。 然后,您可以保證排序將是您的排序所強加的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.