我有一个脚本,通常需要执行以下两个任务之一:
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')
如何根据需要修改此功能?
答案 0 :(得分:3)
如果你想坚持使用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)