2012-03-22 20 views
24

Pythonで複数のサブフォルダを持つディレクトリ内のすべてのファイルの絶対パスを取得するにはどうすればよいですか?ディレクトリ内のすべてのファイルの絶対パスを取得する

私はos.walk()が再帰的に私にディレクトリとファイルのリストを与えてくれることを知っていますが、それは私が望むものを私に与えてくれないようです。

+0

あなたがもらえあなたが期待する入出力の例 – cwallenpoole

答えて

32

os.path.abspathはパスが絶対的であることを確認します。以下のヘルパー関数を使用します。

import os 

def absoluteFilePaths(directory): 
    for dirpath,_,filenames in os.walk(directory): 
     for f in filenames: 
      yield os.path.abspath(os.path.join(dirpath, f)) 
+0

ループ内でN回実行するよりも、 'os.walk'行でabspathを1回実行するほうがよかったと思います。 – wim

+0

これはうまく動作しますが、「事故」に​​よってのみ機能します。 'os.path.join'の契約書を読んでも、議論の一つであれば結果が絶対的であることを保証する場所は見つけられませんが、それは合理的な前提です。 – phihag

+0

最後に余分な括弧があります。 yield os.path.abspath(os.path.join(dirpath、f)) – jumbopap

7
import os 

for root, dirs, files in os.walk(os.path.abspath("../path/to/dir/")): 
    for file in files: 
     print os.path.join(root, file) 
+0

さて、どういう意味なのか、私はファイルを望んでいないのですが、特定のサブディレクトリがほしいと思っています。私は以下の解決策を掲載しました。 –

3

あなたは絶対パスに相対パスを回すためにos.path.abspath()を使用することができます。

file_paths = [] 

for folder, subs, files in os.walk(rootdir): 
    for filename in files: 
    file_paths.append(os.path.abspath(os.path.join(folder, filename))) 
+1

これは 'cwd'を' filename'に結びつけません。あなたが 'folder'に参加したいのですか? – wim

+0

ありがとう、ブレンダー。しかし、私はそれが.. os.path.abspath(os.path.join(フォルダ、ファイル名))でなければならないと思います.. – madCode

+1

なぜそうですか。ありがとう、私はそれを修正しました。 – Blender

7

試してみてください。

import os 

for root, dirs, files in os.walk('.'): 
    for file in files: 
     p=os.path.join(root,file) 
     print p 
     print os.path.abspath(p) 
     print 
+0

とにかく隠しファイルをキャプチャせずにこれを行うには? –

+0

@MarcelMarino 'もしそうでなければfile.startswith( '。')' –

0

私はサブディレクトリの詳細ではなくファイルを維持したいし、それらにおける1つのXMLファイルでのみサブディレクトリを望んでいました。私は、このようにそれを行うことができます。

for rootDirectory, subDirectories, files in os.walk(eventDirectory): 
    for subDirectory in subDirectories: 
    absSubDir = os.path.join(rootDirectory, subDirectory) 
    if len(glob.glob(os.path.join(absSubDir, "*.xml"))) == 1: 
     print "Parsing information in " + absSubDir 
2

あなたは、Python 3.4以降を使用している場合(古いPythonのバージョンを持っている場合、またはサードパーティのバックポート)あなたはpathlibを使用することができます。

import pathlib 
for filepath in pathlib.Path(directory).glob('**/*'): 
    print(filepath.absolute()) 
関連する問題