0

スクリプトに引数として渡されたファイルを処理するスクリプトがあります。スクリプトに渡されたファイルが存在しない場合、エラー メッセージを stderr に書き込みたいと考えています。ここで見つけることができるすべての関連投稿を読んだ後、次の最小限の作業例が機能しない理由を理解できません。ファイルが存在する場合は期待どおりに動作しますが、ファイルが存在しない場合は何もしないように見えます。

#!/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.iglob(args.src_path)

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

2 に答える 2

3

glob.iglobそのパスに既に存在するファイルのリストを返しているため、問題は既存のファイルのみをテストしていることです。iglobを次のように置き換えてみてください。

files = [ 
    os.path.join(args.src_path, 'EXISTENT_FILE'),
    os.path.join(args.src_path, 'NON_EXISTENT_FILE'),
]

ただし、例外はコストがかかります。を使用してファイルをチェックする方が安価なはずですos.path.exists(副作用に依存していないため、間違いなくクリーンです):

import os.path

for file in files:
    if os.path.exists(file):
        sys.stdout.write('File exists: ' + file + '\n')
    else:
        sys.stderr.write('File does not exist: ' + file + '\n')

ただし、ディレクトリ ルックアップを実行して取得filesした場合は、リストとテストの間に削除されない限り、常にすべて存在します。

于 2012-08-24T04:23:56.177 に答える
2

存在しないファイルは によって返されませんglob.iglob。ループforは、存在するファイルに対してのみ反復します。

于 2012-08-24T04:02:17.670 に答える