根据Python文档,os.listdir()
返回一个包含给定路径下所有目录项名称的列表。该列表是任意排序的。
该列表中项目的排列顺序是任意的。
我想知道的是,这个任意顺序是否总是相同/确定性的?(在不同机器上或者时间上,只要文件夹的内容相同)
编辑:我并没有尝试使其变得确定性,也不想使用它。我只是想知道(例如,它的排序顺序依赖于什么?)
根据Python文档,os.listdir()
返回一个包含给定路径下所有目录项名称的列表。该列表是任意排序的。
该列表中项目的排列顺序是任意的。
我想知道的是,这个任意顺序是否总是相同/确定性的?(在不同机器上或者时间上,只要文件夹的内容相同)
编辑:我并没有尝试使其变得确定性,也不想使用它。我只是想知道(例如,它的排序顺序依赖于什么?)
DIR *dirp; // will store the pointer to the directory
struct dirent *ep; // will store the pointer to the entry
opendir
(位于第2596行)和 readdir
(位于第2611行)。readdir
手册页面中读到的那样:
因此,readdir()函数返回指向dirent结构的指针,表示目录流中下一个目录项。 在到达目录流的末尾或发生错误时,它返回NULL。
readdir
读取目录中的下一个条目,但是由文件系统实现定义什么是下一个条目。 您可以在这里阅读更多关于此主题的信息:
[...] 因为这是每个文件系统的事情,所以遍历顺序可以在同一系统上的不同目录中不同,即使它们按相同的顺序创建了相同的条目,这是因为目录使用不同的文件系统类型或仅因为对不同的文件系统设置了一些参数。
opendir
和readdir
实现的钩子函数,您需要进一步了解文件系统以及目录数据结构是如何存储的...然而,简短的版本非常简单:底层文件系统不按文件名排序存储目录项。它关心保持目录项的完整性和一致性,文件名只是与每个目录项关联的任意标签,并且与文件系统的核心功能无关。担心与每个目录项关联的人类可读标签是在更高级别上完成的,例如在您的Python代码中。是的,它是确定性的,当然不是故意随机的。然而,确定性深入到文件系统实现的细节中,文件名的词法顺序在其中不起任何作用。listdir()
结果吗? - Potemkin这可能取决于文件系统内部。在典型的Unix机器上,我期望从os.listdir
返回值中的项目顺序应该与目录的“dirent”数据结构中的详细信息顺序相同(这又取决于文件系统的具体情况)。
如果添加和删除文件,则不希望目录随时间而具有相同的排序。
除非在从一个到另一个的复制过程中采取了特定的措施,否则我不希望两个“具有相同内容的目录”在两台不同的计算机上具有一致的排序。
根据各种具体情况,单台机器上的排序可能会随着时间的推移而发生变化,而无需对目录进行任何显式更改(尽管我认为我没有看到过实际执行此操作的文件系统,但这绝对是可以完成的操作)。
简而言之,如果您想要任何可推理的排序,请以某种方式对结果进行排序。然后,您就有了保证,即排序将是您的排序所强加的任何内容。
os.listdir
100次,则会得到相同的结果。但这仅是具有相同设置的一个会话。 - SuperBiasedMan