当被要求打印dirpaths时,os.walk()永远不会返回

时间:2013-08-15 19:10:02

标签: python os.walk

我有一个简单的目录结构:

rootdir\
    subdir1\
        file1.tif
    subdir2\
        file2.tif
    ...
    subdir13\
        file13.tif
    subdir14\
        file14.tif

如果我打电话:

import os

print os.listdir('absolute\path\to\rootdir')

...然后我得到你期望的东西:

['subdir1', 'subdir2', ... 'subdir13', 'subdir14']

如果我在这些子目录上调用os.listdir(),也会发生同样的事情。对于每一个,它返回该目录中文件的名称。没有问题。

如果我打电话:

import os

for dirpath, dirnames, filenames in os.walk('absolute\path\to\rootdir'):
    print filenames
    print dirnames

...然后我得到你期望的东西:

[]
['subdir1', 'subdir2', ... 'subdir13', 'subdir14']
['file1.tif']
[]
['file2.tif']
[]
...

但这是奇怪的。我打电话的时候:

import os

for dirpath, dirnames, filenames in os.walk('absolute\path\to\rootdir'):
    print filenames
    print dirnames
    print dirpath

......永远不会回来。即使我尝试:

print [each[0] for each in os.walk('absolute\path\to\roodir')]

......或任何类似的东西。我总是可以打印os.walk()返回的元组的第二和第三部分,但是当我尝试触摸第一部分时,整个事情就停止了。

更奇怪的是,此行为仅出现在使用shell启动的脚本中。命令行解释器正常运行。我很好奇,这里发生了什么?

- - - - - - - - EDIT 实际代码:

ALLOWED_IMGFORMATS = [".jpg",".tif"]

def getCategorizedFiles(pathname):
    cats = [each[0] for each in os.walk(pathname) if not each[0] == pathname]
    ncats = len(cats)
    tree = [[] for i in range(ncats+1)]
    for cat in cats:
        catnum = int(os.path.basename(cat))
        for item in os.listdir(cat):
            if not item.endswith('.sift') and os.path.splitext(item)[-1].lower() in ALLOWED_IMGFORMATS:
                tree[catnum].append(cat + '\\' + item)
    fileDict = {cat : tree[cat] for cat in range(1,ncats+1)}
    return fileDict

----编辑2 ---- 另一个发展。如上所述,当代码在从shell启动的脚本中时,存在此问题。但不是任何外壳。 Console 2存在问题,但Windows命令提示符不存在。当脚本从java启动时(我最初遇到问题的方式)也是如此:http://www.programmersheaven.com/mb/python/415726/415726/invoking-python-script-from-java/?S=B20000

1 个答案:

答案 0 :(得分:1)

我从未真正信任os.walk()。只需编写自己的递归内容。这并不难:

def contents(folder, l): # Recursive, returns list of all files with full paths
    directContents = os.listdir(folder)
    for item in directContents:
        if os.path.isfile(os.path.join(folder, item)):
            l.append(os.path.join(folder, item))
        else:contents(os.path.join(folder, item), l)
    return l
contents = contents(folder, [])
然后

contents将列出包含完整路径的所有文件。如果你想让它更容易阅读,你可以使用os.split()。

了解其工作原理消除了在代码中使用os.walk()的不确定性,这意味着您将能够识别代码中的问题是否真的与os.walk()有关。

如果您需要将它们放在字典中(因为字典也有别名优势),您也可以按照这种方式对文件进行排序。