Path('.').glob('*.ext')
会产生一致的结果排序吗(假设正在通配的文件不会改变)?
似乎全局排序是基于文件系统顺序(至少对于旧的
glob
包)。通过将文件添加到目录(不会包含在 glob 中),是否会更改 pathlib
的 glob
顺序?即使没有向特定目录添加任何内容(例如,当系统上其他地方进行其他大型文件更改时),文件系统是否会更改此顺序?在几天的时间里?或者在所有这些情况下顺序会保持一致吗?
澄清一下,我无法简单地转换为列表并排序,因为有太多文件路径无法同时放入内存。我希望每次都能达到相同的顺序,因为我将进行一些 ML 训练,并且希望将每个第 n 个文件留作验证数据。此培训将需要几天的时间,这就是为什么我有兴趣知道订单在文件系统上是否长时间保持稳定。
查看
pathlib
模块的源代码,偶然发现latest commit直接指向了相关的地方:
在
中使用os.scandir()
作为上下文管理器。Path.glob()
因此,在幕后
Path.glob
使用 os.scandir
来获取目录条目。该函数的文档报告结果是无序的:
返回与路径给定的目录中的条目相对应的
对象的迭代器。 条目按任意顺序产生,不包括特殊条目os.DirEntry
和'.'
。'..'
(强调我的)
根据经验,glob 的任意顺序/文件系统顺序不会随时间变化,除非您手动更改文件。
通过重复运行 Path.glob() 我可以看到排序在同一操作系统上是一致的,但是我在 Windows 上得到有序结果,在 Linux 上得到无序结果。
正如“a-guest”指出的那样,Path.glob() 在底层使用了 os.scandir(),这确实会产生依赖于操作系统的结果。