2013-08-15 9 views
5

を印刷するように尋ねられたとき、私はシンプルなディレクトリ構造を持って返すことはありませんexpect:os.walkは()dirpathsに

['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から起動されたときにも存在します(私が元々どのように問題に遭遇したか)。http://www.programmersheaven.com/mb/python/415726/415726/invoking-python-script-from-java/?S=B20000

+0

問題の内容が不明です。私はちょうどスクリプトであなたのコードを貼り付けコピーし、走った(私は 'python 2.7'を使っています)、それはちょうど期待どおりに動いています – Anshul

+7

そのバックスラッシュで注意してください。スラッシュを使わないのはなぜですか?彼らは窓で作業し、奇妙なエスケープ問題を作りません。 – user2357112

+0

多分問題は窓に固有です。デバッガを使用して、実行時に実行中のコードを確認しましたか? – arghbleargh

答えて

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()に関係しているかどうかを識別できます。

辞書に追加する必要がある場合(辞書にエイリアシングの利点があるため)、そのようにファイルを並べ替えることもできます。

+0

+1 for self.walk(私は自分自身を使用します)。しかし、あなたは "+"のために-1を得る。 "%s /%s"%(フォルダ、アイテム)を使用してください。単純な時間を置くと、その違いが表示されます。 os.listdir(フォルダ)内のxの= ["%s /%s"%(folder、x)] – cox

+0

十分に適切です。助言をいただきまして、有益な投票の代わりに訂正していただきありがとうございます。 – user2569332

+0

私はこれをリストを返す関数の代わりにジェネレータオブジェクトにすることを検討します。ほとんどの場合、ファイルのリスト全体を一度に作成する必要はなく、実行すると 'list(contents)'を簡単に実行できます。 –

関連する問題