我必须检查多个文件的存在和可读性。哪种方法最有效?
list_of_files = [fname1,fname2,fname3]
for fname in list_of_files:
try:
open(fname, 'r').close()
except IOError:
raise YourCustomError
或
list_of_files = [fname1,fname2,fname3]
for fname in list_of_files:
if not ps.path.isfile(fname):
raise YourCustomError
答案 0 :(得分:2)
如果您计划使用这些文件,那么既不。在您的通话和使用该文件时,可能会删除文件或更改权限,从而使该信息过时。而只是尝试使用该文件并在那里处理异常:
try:
with open(fname, 'r') as f:
# use f
except FileNotFoundError as e:
# file was deleted
except IsADirectoryError as e:
# path exists but is a directory
except PermissionError as e:
# you don't have permissions to read the file
except OSError as e:
# other error
但是,如果您正在编写一个显示有关用户权限信息的工具,那么使用专门为此目的提供的方法和函数是有意义的,因此您应该使用os.path.exists
和{{3 }和os.is_file
。
如果您正在处理整个目录,请注意使用os.is_dir
并检查DirEntry
对象上的方法效率更高。
答案 1 :(得分:1)
有一个共同的理念 - 执行并请求宽恕而不是事先征得许可。
第一种方法尝试以可读模式打开文件,如果它不存在或不可读则会失败。在这里,我们在操作失败后要求原谅。
在第二种方法中,我们首先要求获得许可。然而,您的第二个示例只是检查它是否是文件,不检查权限。
但是,使用上下文管理器(with open(filename, "r")
)可能是一种更好的方法,而不是手动关闭文件处理程序。
答案 2 :(得分:1)
我必须检查多个文件的存在和可读性。哪种方法最有效?
这不仅仅是效率问题,因为你的两种方法都不做同样的事情。例如,由于权限,文件可能是exist and be unreadable to you。您的第一种方法是实际检查文件是否开放且可读的两种方法中的唯一方法(至少在某个时间点 - 您的方法都有竞争条件)。