我有一个脚本来处理作为参数传递给脚本的文件。如果传递给脚本的文件不存在,那么我想向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')
答案 0 :(得分: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
,那么除非在列表和&之间删除任何内容。测试,他们将永远都存在。
答案 1 :(得分:2)
glob.iglob
不会返回不存在的文件。您的for
循环只会迭代存在的文件。