为什么文件的存在无法进行此测试?

时间:2012-08-24 03:56:44

标签: python exception

我有一个脚本来处理作为参数传递给脚本的文件。如果传递给脚本的文件不存在,那么我想向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')

2 个答案:

答案 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循环只会迭代存在的文件。