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() によって返されるタプルの 2 番目と 3 番目の部分はいつでも出力できますが、最初の部分に触れようとすると、すべてが停止します。

さらに奇妙なことに、この動作は、シェルを使用して起動されたスクリプトでのみ発生します。コマンド ライン インタープリターは正常に動作します。ここで何が起こっているのですか?

-----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

----EDIT 2---- 別の開発。前述のように、この問題は、コードがシェルから起動されたスクリプト内にある場合に発生します。しかし、シェルではありません。問題はコンソール 2 に存在しますが、Windows コマンド プロンプトには存在しません。また、スクリプトが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 に答える