1

通常、次の 2 つのタスクのいずれかを実行する必要があるスクリプトがあります。

1) ワイルドカード展開から展開されたパスを持つ一連のファイルを処理します。
2) 明確なパスを持つ特定のファイルを処理します。

ワイルドカード展開を処理するために glob を使用してきましたが、これは問題を引き起こします。glob は実際に存在するパスのみを返すため、存在しないファイルへの特定のパスがユーザーによって指定された場合、コードはエラーを生成しません。

以下は、コードの最小限の作業例 (MWE) です。MWE は、ワイルドカードから展開された既存のファイルを喜んで処理しますが、glob は既存のパスしか返さないため、目的のエラー メッセージを生成しません。

#!/usr/bin/env python3

import argparse, glob, sys, os

parser = argparse.ArgumentParser()
parser.add_argument("src_path", metavar="path", type=str,
    help="Path to files to be merged; enclose in quotes, accepts * as wildcard for directories or filenames")

args = parser.parse_args()
files = glob.iglob(args.src_path)

for file in files:
    try:    
        with open(file, 'r') as f:
            sys.stdout.write('File exists: ' + file + '\n') 
    except IOError:
        sys.stderr.write('File does not exist: ' + file + '\n') 

これを変更して、希望どおりに動作させるにはどうすればよいですか?

4

1 に答える 1

4

glob.iglobを使い続けたい場合:

#!/usr/bin/env python3

import argparse, glob, sys, itertools

parser = argparse.ArgumentParser()
parser.add_argument("src_path", metavar="path", type=str,
    help="Path to files to be merged; enclose in quotes, accepts * as wildcard for directories or filenames")

args = parser.parse_args()
files = glob.iglob(args.src_path)

try:
    first_file = files.next()
except StopIteration:
    print('File does not exist: ' + args.src_path, file=sys.stderr)
    sys.exit(1)
for file in itertools.chain([first_file], files):
    print('File exists: ' + file)

glob.globが受け入れられる場合:

#!/usr/bin/env python3

import argparse, glob, sys

parser = argparse.ArgumentParser()
parser.add_argument("src_path", metavar="path", type=str,
    help="Path to files to be merged; enclose in quotes, accepts * as wildcard for directories or filenames")

args = parser.parse_args()
files = glob.glob(args.src_path)

if not files:
    print('File does not exist: ' + args.src_path, file=sys.stderr)
for file in files:
    print('File exists: ' + file)
于 2012-08-24T23:46:03.280 に答える