1

我有一个通常需要执行以下两个任务之一的脚本:

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 回答