5

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

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 启动的脚本中。命令行解释器正常运行。我很好奇,这是怎么回事?

-----编辑----- 实际代码:

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 启动的脚本中时,就会出现此问题。但不是任何外壳。控制台 2 存在问题,但 Windows 命令提示符不存在。当脚本从java启动时它也存在(我最初是如何遇到问题的),如下所示:http: //www.programmersheaven.com/mb/python/415726/415726/invoking-python-script-from-java/ ?S=B20000

4

1 回答 1

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() 有关。

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

于 2013-08-21T16:43:23.517 回答