我有一个关于在scandir函数中排序的基本问题。到目前为止,我阅读了POSIX readdir的手册页,没有找到关于订购保证的具体信息。
但是,当我在大型目录(不能更改,只能读取)上迭代时,我在多个系统(Fedora 24和Ubuntu 16.04)上观察到相同的结果。
这种行为的原因是什么?我能在哪里读到更多关于它的资料?
如果我需要的是订购,我是应该编写自己的POSIX 斯堪迪尔包装器,还是有人知道python的现有实现?
发布于 2016-12-21 08:45:41
readdir的手册页是显式的:
通过对readdir()的连续调用读取文件名的顺序取决于文件系统实现;名称不太可能以任何方式排序。
在大多数实现中,目录是顺序列表条目,readdir和scandir都遵循底层顺序。如果您在不同的Linux版本上使用类似的文件系统,并且按相同的顺序填充目录,那么readdir可能也会给出相同的顺序。该顺序不是随机的,而且绝对是确定性的和可复制的,前提是您不添加、删除或重命名任何文件(至少在文件系统稳定之后,因为有些文件系统可以延迟一些操作)。简单地说,它不能从文件名中预测。
因此,如果你想要一个一致的秩序,你必须处理自己的订单。
发布于 2018-08-22 08:31:04
要回答问题的第二部分,下面是一个排序的实现:
for f in sorted(os.listdir('/usr/share')): print(f)在这里使用listdir(),而不是scandir()来获得字符串的名称列表,这比scandir()返回的DirEntry对象更容易排序。
https://stackoverflow.com/questions/41258051
复制相似问题