0

我有一个脚本,它处理作为参数传递给脚本的文件。如果传递给脚本的文件不存在,那么我想向标准错误写入一条错误消息。阅读了我可以在此处找到的所有相关帖子后,我无法理解为什么以下最小工作示例不起作用。如果文件存在,它会按预期运行,但如果文件不存在,它似乎什么也不做。

#!/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 回答