Python scandir() 排序 \ POSIX readdir 排序
Python scandir() ordering \ POSIX readdir ordering
我有一个关于在 scandir
函数中排序的基本问题。到目前为止,我阅读了 POSIX readdir
的手册页,但没有找到有关订购保证的具体信息。
但是当我遍历大目录(无法更改,只读)时,我在多个系统(Fedora 24 和 Ubuntu 16.04)上观察到相同的结果。
这种行为的原因是什么?我在哪里可以阅读更多相关信息?
如果我需要连续排序,我应该围绕 POSIX scandir 编写自己的包装器还是有人知道 python 的现有实现?
readdir
的手册页是明确的:
The order in which filenames are read by successive calls to
readdir() depends on the filesystem implementation; it is unlikely
that the names will be sorted in any fashion.
在大多数实现中,目录是顺序列表条目,readdir
和 scandir
都遵循基本顺序。如果您在不同的 Linux 版本上使用类似的文件系统,并以相同的顺序填充目录,则 readdir
可能也会给出相同的顺序。如果您不添加、删除或重命名任何文件(至少一旦文件系统 稳定 ,因为有些文件系统可能会延迟某些操作),则该顺序不是随机的并且是绝对确定的和可重现的。只是从文件名中无法预测。
所以如果你想要一致的顺序,你必须自己处理顺序。
为了回答问题的第二部分,这里有一个排序的实现:
for f in sorted(os.listdir('/usr/share')): print(f)
在这里使用 listdir() 而不是 scandir() 来获取字符串形式的名称列表,这比 scandir() 返回的 DirEntry 对象更容易排序。
我有一个关于在 scandir
函数中排序的基本问题。到目前为止,我阅读了 POSIX readdir
的手册页,但没有找到有关订购保证的具体信息。
但是当我遍历大目录(无法更改,只读)时,我在多个系统(Fedora 24 和 Ubuntu 16.04)上观察到相同的结果。
这种行为的原因是什么?我在哪里可以阅读更多相关信息?
如果我需要连续排序,我应该围绕 POSIX scandir 编写自己的包装器还是有人知道 python 的现有实现?
readdir
的手册页是明确的:
The order in which filenames are read by successive calls to readdir() depends on the filesystem implementation; it is unlikely that the names will be sorted in any fashion.
在大多数实现中,目录是顺序列表条目,readdir
和 scandir
都遵循基本顺序。如果您在不同的 Linux 版本上使用类似的文件系统,并以相同的顺序填充目录,则 readdir
可能也会给出相同的顺序。如果您不添加、删除或重命名任何文件(至少一旦文件系统 稳定 ,因为有些文件系统可能会延迟某些操作),则该顺序不是随机的并且是绝对确定的和可重现的。只是从文件名中无法预测。
所以如果你想要一致的顺序,你必须自己处理顺序。
为了回答问题的第二部分,这里有一个排序的实现:
for f in sorted(os.listdir('/usr/share')): print(f)
在这里使用 listdir() 而不是 scandir() 来获取字符串形式的名称列表,这比 scandir() 返回的 DirEntry 对象更容易排序。