0

a.shp または b.shp と、その他のその他のファイルを含むフォルダーがいくつかあります。または、1 つのフォルダーに a.shp と b.shp の両方を含めることができます。その場合、a.shp を選択したいと思います。フォルダーに 2 つのファイルがない場合は、そのフォルダーを分析から除外します。

次のような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でそれを行う方法についてアドバイスを提供できれば、本当に感謝しています.

ありがとうございました。

4

3 に答える 3

1

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

于 2012-04-27T01:29:32.057 に答える
1

あなたのコードは問題の説明と一致していないと思います。問題が正しく説明されていると想定しているので、必要なディレクトリをフィルタリングする関数を作成しました。

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'])
于 2012-04-27T01:50:15.107 に答える
0

os.path.exists などのインポートを避けたい場合は、try/catch ロジックを使用できます。a がある場合は、常にそれが必要なので、開いてみることができます。それでもうまくいかない場合は、エラーをキャッチして、b を開いてみてください。それでもうまくいかない場合は、エラーをキャッチしてそのフォルダーを無視します。

これを行うための推奨される方法を示すドキュメントのコード スニペット(「例外」の場合は 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 で別の方法を示すスニペット:

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 の方法で実行したい場合は、何でもしてください。どちらの方法でも機能します。

于 2012-04-27T01:32:55.783 に答える