2012-04-27 6 views
0

私は、a.shpまたはb.shpのいずれかを持ついくつかのフォルダといくつかのその他のファイルを持っています。または、1つのフォルダにa.shpとb.shpの両方を入れることができます。その場合は、a.shpを選択します。フォルダに2つのファイルがない場合、そのフォルダを分析から除外します。Pythonでファイル名の条件付きファイルを探す

私は次のようなものPythonコードを記述する必要があります。

if folder1 has a.shp only: 
    myunit = r"D:\folder1\a.shp" 
elif folder2 has b.shp only: 
    myunit = r"D:\folder2\b.shp" 
elif folder3 has a.shp and b.shp: 
    myunit = r"D:\folder3\a.shp" 
elif folder4 doesn't have a.shp and b.shp: 
    Don't assign anything into myunit. 

誰かがPythonでそれを行う方法についてのアドバイスを提供することができれば、私はそれを本当に感謝。

ありがとうございます。

答えて

1

あなたのコードはあなたの問題の説明と一貫していないと思います。 私は問題が正しく記述されていることを想定していますので、私はあなたが必要なのdirsをフィルタリング機能を作成しました:

import os 

def filter_dirs(dirs=[]): 
    result = [] 
    for dir in dirs: 
     files = os.listdir(dir) 
     file_a = 'a.shp' in files 
     file_b = 'b.shp' in files 
     if file_a or file_b: 
      result.append({'dir':dir, 'file_a':file_a, 'file_b':file_b}) 
    return result 

そして、一部のフォルダで機能を試してみて、その結果を参照してください。

filter_dirs(['D:\folder1', 'D:\folder2', 'D:\folder3']) 
+0

私は次のエラーメッセージが表示されます。AttributeError: 'list'オブジェクトに 'push'属性がありません。しかし、 "push"を "append"に置き換えることができました。ありがとうございました。 –

+0

おっと、そうです。私はコンソール上でコードをテストしなかった。今は固定です、ありがとうございます。 – sebasuy

1

os.path.existsが引数としてパス名をとり、存在するファイル(またはディレクトリ)の名前に応じてTrueまたはFalseを返します。また、ファイル名の作成にはos.path.joinが必要になるでしょう。

0

os.path.existsなどをインポートしないようにするには、try/catchロジックを使用します。あなたがそこにいるなら、あなたはいつもそれを望んでいるので、あなたはそれを開こうとすることができます。それでも問題が解決しない場合は、エラーをキャッチしてbを開いてみてください。それでも問題が解決しない場合は、エラーをキャッチしてそのフォルダを無視してください。

docs(「例外」のCTRL + F)からコードスニペットこれを行うために推奨される方法を示す:

ドキュメントからまた
def get_status(file): 
    try: 
     return open(file).readline() 
    except EnvironmentError as err: 
     print "Unable to open file: {}".format(err) 
     sys.exit(1) 

、はos.pathとして有する他の方法を示すスニペットGarethは次のように説明しています。

def get_status(file): 
    if not os.path.exists(file): 
     print "file not found" 
     sys.exit(1) 
    return open(file).readline() 

しかし、文書ではこれをスタイルに基づいて推奨しています。 Pythonは故意にエレガントな例外処理を持っています。あなたがそれをする前にすべてのCスタイルの妄想検査を心配するよりも、これを利用するのがもっと慣れていると考えられます。あなたがそれをos.pathのやり方でしたいのであれば、何でもしてください。いずれかの方法で動作します。

関連する問題