【问题标题】:Python scandir() ordering \ POSIX readdir orderingPython scandir() 排序\POSIX readdir 排序
【发布时间】:2016-12-21 08:15:12
【问题描述】:

我有一个关于在scandir 函数中订购的基本问题。到目前为止,我阅读了 POSIX readdir 的手册页,并没有找到有关订购保证的具体信息。

但是当我遍历大目录(无法更改,只读)时,我在多个系统(Fedora 24 和 Ubuntu 16.04)上观察到相同的结果。

这种行为的原因是什么?我可以在哪里阅读有关它的更多信息?

如果我需要一致的订购,我应该围绕 POSIX scandir 编写自己的包装器还是有人知道 python 的现有实现?

【问题讨论】:

标签: python linux posix


【解决方案1】:

readdir 的手册页是明确的:

连续调用读取文件名的顺序 readdir() 取决于文件系统的实现;不太可能 名称将以任何方式排序。

在大多数实现中,目录是一个顺序列表条目,readdirscandir 都遵循底层顺序。如果你在不同的 Linux 版本上使用了类似的文件系统,并以相同的顺序填充目录,那么readdir 很可能也会给出相同的顺序。如果您不添加、删除或重命名任何文件(至少一旦文件系统稳定,因为有些可能会延迟某些操作),顺序不是随机的,并且是绝对确定性和可复制的。只是从文件名中无法预测

因此,如果您想要一致的订单,您必须自己处理订单。

【讨论】:

    【解决方案2】:

    为了回答问题的第二部分,这里有一个排序实现:

    for f in sorted(os.listdir('/usr/share')): print(f)
    

    这里使用 listdir(),而不是 scandir() 来获取字符串形式的名称列表,这比 scandir() 返回的 DirEntry 对象更容易排序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 1970-01-01
      • 2012-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多