Python os.walk存在差异

3
我编写了一个脚本来爬取系统中的目录并记录文件元数据。我使用os.walk来完成这项工作。它在大部分情况下都能正常工作,但在不同的机器上运行时会返回不同的文件列表。
现在我正在测试我的Dropbox文件夹;在我的MBPro(lion)上,它可以遍历文件夹并返回正确数量的文件。但在我的iMac(mountain lion)上却不能,通常每次运行会跳过1-3个文件。额外的爬取会捕捉到一个迷路者,但通常它仍然会忽略目录中的一些文件。
以下是代码的简短片段:
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

我显然希望忽略目录。 有更好的方法吗?最好是一种操作系统无关的方法。


1
如果你只是收集文件名的信息,那么你不需要遍历目录名称。 - Martijn Pieters
1
“dirnames”是当前路径的子目录,也是“filenames”的同级目录。如果需要完整路径,请使用“dirname”。只是在“dirname”中,目录和文件名是分别列出来的。 - Martijn Pieters
1
没错,所以你不需要循环遍历 dirnames。你没有使用 dirnames 的值。 - Martijn Pieters
1
不,你不能。但是你可以完全删除 for subdirname in dirnames: 循环。 - Martijn Pieters
1
@frankV:子目录中的文件将在循环的下一次搜索中被查找。directories列表大多是为了让您可以更改顺序和/或添加或删除要在广度优先搜索中下一步搜索的目录。 - Martijn Pieters
显示剩余9条评论
1个回答

2
这个技巧就像@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'   

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接