簡體   English   中英

os.listdir()是確定性的嗎?

[英]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 您可以在此處閱讀有關此主題的更多信息:

[...]因為這是每個文件系統的事,所以即使同一目錄中創建的條目相同,遍歷順序對於同一系統上的不同目錄也可能不同,或者是因為目錄使用的目錄不同文件系統類型,或者僅僅是因為在不同的文件系統上設置了一些參數而已。

您可以查看@Hamish在評論中發布的鏈接該鏈接對Python與UNIX的opendirreaddir實現的鈎子進行了一些深入研究,您需要從那里深入研究文件系統以及如何存儲目錄數據結構...

但是,它的簡短版本非常簡單:基礎文件系統不存儲按文件名排序的目錄條目。 它與保持目錄條目合理和一致有關, 文件名只是與每個條目相關聯的任意標簽,與文件系統的核心功能無關。 擔心與每個目錄條目關聯的人類可讀標簽是在更高層次上進行的,例如在您的Python代碼中。

是的,它確定性的,當然不是故意將其隨機化的 但是,確定性在文件系統實現的細節中深處,文件名的詞法順序在其中不起作用。

它可能取決於文件系統內部。 在典型的unix機器上,我希望os.listdir返回值中的項順序與目錄“ dirent”數據結構中詳細信息的順序相同(這又取決於文件系統的詳細信息) )。

如果添加和刪除文件,我不希望目錄隨時間推移具有相同的順序。

我不希望兩台不同機器上的兩個“具有相同內容的目錄”具有一致的順序,除非在從一台計算機復制到另一台計算機時特別注意。

視各種具體情況而定,隨着時間的推移,順序可能會在一台計算機上更改,而不會對目錄進行任何顯式更改,因為會進行各種文件系統壓縮操作(盡管我認為我沒有看到過這樣的文件系統:實際上可以做到這一點,但這絕對是可以做到的)。

簡而言之,如果您想進行任何排序,就可以對結果進行排序。 然后,您可以保證排序將是您的排序所強加的。

暫無
暫無

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

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