2024-10-04 11:24:03 发布
网友
我有一个关于scandir函数排序的基本问题。到目前为止,我阅读了POSIX的手册页readdir,但没有找到有关订购担保的具体信息。在
scandir
readdir
但当我迭代大目录(不能更改,只读)时,我在多个系统(Fedora24和Ubuntu16.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和{}都遵循基本顺序。如果您在不同的Linux版本上使用相似的文件系统,并且以相同的顺序填充目录,readdir也可能给出相同的顺序。如果不添加、删除或重命名任何文件(至少在文件系统稳定时,因为有些文件系统可能会延迟某些操作),则顺序不是随机的,并且是绝对确定的和可复制的。简单地说,从文件名来看,它是不可预测的。在
所以,如果你想要一个一致的订单,你必须自己处理订单。在
为了回答问题的第二部分,下面是一个实现,它对以下内容进行排序:
for f in sorted(os.listdir('/usr/share')): print(f)
在这里使用listdir()而不是scandir()以字符串形式获取名称列表,这比scandir()返回的DirEntry对象排序更容易。在
readdir
的手册页是显式的:在大多数实现中,目录是一个连续的列表项,}都遵循基本顺序。如果您在不同的Linux版本上使用相似的文件系统,并且以相同的顺序填充目录,
readdir
和{readdir
也可能给出相同的顺序。如果不添加、删除或重命名任何文件(至少在文件系统稳定时,因为有些文件系统可能会延迟某些操作),则顺序不是随机的,并且是绝对确定的和可复制的。简单地说,从文件名来看,它是不可预测的。在所以,如果你想要一个一致的订单,你必须自己处理订单。在
为了回答问题的第二部分,下面是一个实现,它对以下内容进行排序:
在这里使用listdir()而不是scandir()以字符串形式获取名称列表,这比scandir()返回的DirEntry对象排序更容易。在
相关问题 更多 >
编程相关推荐