【问题标题】:Python3. Why is os.scandir not scanning sequentially? [duplicate]蟒蛇3。为什么 os.scandir 不按顺序扫描? [复制]
【发布时间】:2018-02-21 16:39:07
【问题描述】:

我有一个包含 1600 张照片的目录,我需要将每个照片的路径保存到一个列表中,然后保存到 .txt 文件中。

这些照片是根据它们应该在列表中的位置来枚举的:img(0), img(1)...,我需要保留这个位置。

我得到的是这个顺序,所以现在在列表索引 2 中我有 img(10):

img(0)img(1)img(10)img(100)img(1000)img(1001)...
img(2)img(2)img(20)img(200)@987643332...@@987643332...@ p>

显然,我是唯一遇到此问题的人,因为我没有找到有关此问题的任何讨论。非常感谢你帮助我。

【问题讨论】:

  • 不是获取每个图像文件,还是只是按照与您预期不同的顺序获取它们?
  • 正在顺序扫描;它只是按包含所有字符的字典顺序执行此操作,而不是按列表数字部分的数字顺序执行此操作。
  • os.scandir 的文档说它以任意顺序返回文件,因此您需要应用所需的排序。您可能正在寻找所谓的“自然排序”。
  • @chepner 文档说它以任意顺序扫描,所以我认为情况并非如此。
  • 它是顺序扫描,我认为“任意”意味着用户不知道排序关系(可能是创建时间?inode id?)。我希望如果目录结构os.scandir 中没有发生任何更改,每次调用时都会产生相同的结果。

标签: python list sequence scandir


【解决方案1】:

正如其他人所提到的,文档不保证任何特定的顺序。在您的情况下,它似乎按字母顺序/字典顺序排序。 “10”按字母顺序排在“2”之前。 如果此行为在您的计算机上似乎保持一致,则您必须在每个文件前面添加 0 以使每个文件具有相同的位数以获得所需的顺序。

例如,“002”将出现在“010”之前。

如果您想要安全(例如需要能够将您的代码移植到其他机器/操作系统),您需要手动排序。

【讨论】:

  • docs.python.org/3/library/os.html#os.scandir 根据文档,它以任意顺序扫描,而不是按字典顺序扫描。 OP 应在扫描后采取措施。
  • @SamCraig 你是对的,但这是重复的
  • @SamCraig 实际上对于 OP 来说似乎并不是任意的,我怀疑我的原始答案对他的具体情况很有用。不过你是对的,更新我的答案更正确
  • 哦,我明白了,我认为@DennisSoemers 解决方案和自然排序解决方案(感谢@Jean-FrançoisFabre)可以。非常感谢!
  • 正如更新:natsorted (pypi.python.org/pypi/natsort) 解决了我的问题。再次感谢大家。
猜你喜欢
  • 1970-01-01
  • 2021-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-09
  • 1970-01-01
  • 1970-01-01
  • 2021-08-12
相关资源
最近更新 更多