【问题标题】:Discrepancies with Python os.walk与 Python os.walk 的差异
【发布时间】:2013-01-15 02:41:26
【问题描述】:

我编写了一个脚本来抓取我系统上的目录并记录文件元数据。我已经使用 os.walk 来做到这一点。

它在大多数情况下都有效,但是当在不同的机器上运行时,它会返回不同的文件列表。

现在我正在我的 Dropbox 文件夹上进行测试;在我的 MBPro(lion) 上,它会抓取文件夹并返回正确数量的文件。在我的 iMac(山狮)上它不会,通常每次运行会跳过 1-3 个文件。额外的爬网将拾取一个落后者,但通常它会继续忽略目录中的一些文件。

这是代码的简短 sn-p:

directory = '/Users/user/Dropbox/'
for dirname, dirnames, filenames in os.walk(directory):
  for subdirname in dirnames:
    for filename in filenames:
      if os.path.isfile(filename):
        # collect file info using os.path and os.stat

我显然想忽略目录。有一个更好的方法吗?最好是与操作系统无关的东西。

【问题讨论】:

  • 如果您所做的只是收集有关文件名的信息,您确实不需要循环遍历目录名。
  • dirnames 是当前路径的子目录和filenames 的兄弟姐妹。对于完整路径,请使用 dirname。只是dirname中的目录和dirname中的文件名分别列出来了。
  • 没错,所以你不需要循环dirnames。您没有使用dirnames 的值。
  • 不,你不能。但是您可以完全删除 for subdirname in dirnames: 循环。
  • @frankV: 子目录中的文件将在循环的 next 迭代中搜索。 directories 列表主要提供,以便您可以更改排序和/或添加或删除在呼吸优先搜索中接下来要搜索的目录。

标签: python os.walk


【解决方案1】:

诀窍就像@MartijnPieters 建议的那样。也没有必要循环遍历子目录,因为它们会在循环的下一次迭代中被拾取。这是我的两台机器之间存在差异的原因。

另外值得注意的是,OSX 有一种非常奇怪的方式来计算给定目录中的文件。您可以通过在给定目录上运行 df 然后执行“获取信息”并比较结​​果来看到这一点。

directory = '/Users/user/Dropbox/'
for dirname, dirnames, filenames in os.walk(directory):
    for filename in filenames:
        if os.path.isfile(filename):
            # collect file info using os.path and os.stat'   

【讨论】:

    猜你喜欢
    • 2011-01-05
    • 2016-09-08
    • 2022-08-11
    • 2023-02-25
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多