从Python的文档中,os.listdir()
返回
包含目录中条目名称的列表 路径。该列表是任意顺序。
我想知道的是,这个任意顺序总是相同/确定吗? (从一台机器到另一台机器,或者通过时间,只要文件夹的内容相同)
编辑:我不是想让它确定性,我也不想使用它。我只是想知道(例如,订单依赖于什么?)
答案 0 :(得分:4)
为了理解发生了什么,我们可以检查可以找到here的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调用:第opendir
行2596和第readdir
行2611。
您可以阅读readdir
手册页:
readdir()函数返回一个指向dirent结构的指针,该结构表示dirp指向的目录流中的下一个目录条目。它在到达目录流的末尾或发生错误时返回NULL。
因此,readdir
读取目录中的下一个条目,但由文件系统实现来定义 next 。您可以阅读有关此主题的更多信息here:
[...]因为这是一个按文件系统的事情,所以即使它们具有以相同顺序创建的相同条目,遍历顺序对于同一系统上的不同目录也可以是不同的,或者因为目录使用不同的文件系统类型,或者只是因为某些参数在不同的文件系统上设置不同。
答案 1 :(得分:2)
你可以看看@Hamish在评论中发表的the link,它在Python的opendir
和readdir
实现中挖掘了一些内容,从那里你需要挖掘更深入到文件系统以及如何存储目录数据结构......
它的简短版本很简单:底层文件系统不存储按文件名排序的目录条目。它关注的是保持目录条目的健全和一致,文件名只是与每个条目相关联的任意标签,与文件系统的核心功能无关。担心与每个目录条目相关联的人类可读标签是在更高级别完成的,例如在Python代码中。
是的,它是确定性的,它肯定不是故意随机。但是,确定性在文件系统实现的细节深处,文件名的词法顺序在其中没有任何作用。
答案 2 :(得分:0)
它可能取决于文件系统内部。在典型的unix机器上,我希望os.listdir
的返回值中的项目顺序与目录中的详细信息的顺序相同。" dirent"数据结构(再次,取决于文件系统的细节)。
如果添加和删除文件,我不希望目录在一段时间内具有相同的顺序。
我不希望两个"目录具有相同的内容"在两台不同的机器上进行一致的排序,除非在从一台机器复制到另一台机器时特别小心。
根据各种细节,随着时间的推移,订单可能会在一台机器上发生变化,而不会对目录进行任何明确的更改,因为会进行各种文件系统压缩操作(尽管我不认为我&#39已经看到了一个实际上会这样做的文件系统,但它绝对可以做到。)
简而言之,如果您想要任何排序,您可以推理,以某种方式对结果进行排序。然后,您可以保证订购将是您的分拣所要求的。