2013-05-09 9 views
13

ジオプロセシングを実行しようとしています。私の仕事は、ディレクトリ内のすべてのシェープファイルを見つけて、そのシェープファイルのディレクトリ内のフルパス名を見つけることです。シェイプファイルの名前を取得できますが、シェイプファイルのフルパス名を取得する方法がわかりません。os.walk()を使用して特定のファイルのパスが必要です

shpfiles = [] 
for path, subdirs, files in os.walk(path): 
    for x in files: 
     if x.endswith(".shp") == True: 
      shpfiles.append[x] 

答えて

38

os.walkだけで完全なファイル名を作成するためにos.path.join()を使用し、ループの最初の値としてディレクトリへのあなたのパスを与える:

shpfiles = [] 
for dirpath, subdirs, files in os.walk(path): 
    for x in files: 
     if x.endswith(".shp"): 
      shpfiles.append(os.path.join(dirpath, x)) 

私はと競合しないようにdirpathにループ内pathと改名既にos.walk()に渡していた変数path

結果が.endswith() == Trueの場合はテストする必要はありません。 ifは既にあなたのために、== Trueの部分は完全に冗長です。

あなたは、もう少しコンパクトに上記のコードを作るために.extend()とジェネレータ式を使用することができます。

shpfiles = [] 
for dirpath, subdirs, files in os.walk(path): 
    shpfiles.extend(os.path.join(dirpath, x) for x in files if x.endswith(".shp")) 

か一つでもリストとして理解:

shpfiles = [os.path.join(d, x) 
      for d, dirs, files in os.walk(path) 
      for x in files if x.endswith(".shp")] 
+0

はあなたの助けをありがとう、私はしたいすべてのJPEGを取得!私は思ったよりも簡単だったと思う。 – Schack

-1

os.path.abspath(finename)が動作するようです。してみてください。

shpfiles = [] 
for path, subdirs, files in os.walk(path): 
    for x in files: 
     if x.endswith(".shp") == True: 
      shpfiles.append(os.path.join(path, x)) 
+3

いいえ、それはできません。 'abspath'は、現在の作業ディレクトリ*のファイル名に基づいています。これは完全に異なるパスになります。 –

+0

@Martijn:はい、あなたは正しいです。 – gsmaker

-1

なぜ、import globですか?

import glob 

print(glob.glob('F:\OTHERS\PHOTOS\Panama\\mai13*\\*.jpg')) 

と私は絶対パスで

>>> 
['F:\\OTHERS\\PHOTOS\\Panama\\mai13\\03052013271.jpg', 
'F:\\OTHERS\\PHOTOS\\Panama\\mai13\\05052013272.jpg', 
'F:\\OTHERS\\PHOTOS\\Panama\\mai13\\05052013273.jpg'] 
+2

'glob()'は固定深度のサブディレクトリのみをサポートし、 'os.walk()'は任意の深さをサポートします。 [Pythonでglob.globモジュールを使ってサブフォルダを検索する方法は?](http://stackoverflow.com/questions/14798220/14798263#14798263)を参照してください。 –

関連する問題