尝试读取文件的Pythonic方式以及异常回退到备用文件的情况
问题描述:
尝试读取文件的Pythonic方法是什么,如果读取此异常读取引发异常回退以读取替代文件?尝试读取文件的Pythonic方式以及异常回退到备用文件的情况
这是我写的示例代码,它使用嵌套try
- except
块。这是pythonic:
try:
with open(file1, "r") as f:
params = json.load(f)
except IOError:
try:
with open(file2, "r") as f:
params = json.load(f)
except Exception as exc:
print("Error reading config file {}: {}".format(file2, str(exc)))
params = {}
except Exception as exc:
print("Error reading config file {}: {}".format(file1, str(exc)))
params = {}
答
对于两个文件的方法在我看来不够好。
如果你有多个文件回退到我会用一个循环去:
for filename in (file1, file2):
try:
with open(filename, "r") as fin:
params = json.load(f)
break
except IOError:
pass
except Exception as exc:
print("Error reading config file {}: {}".format(filename, str(exc)))
params = {}
break
else: # else is executed if the loop wasn't terminated by break
print("Couldn't open any file")
params = {}
答
您可以检查file1是否先存在,然后决定打开哪个文件。它会缩短代码并避免重复try -- catch
子句。我相信这是更pythonic,但请注意,您需要在您的模块import os
这个工作。 它可以是这样的:
fp = file1 if os.path.isfile(file1) else file2
if os.path.isfile(fp):
try:
with open(fp, "r") as f:
params = json.load(f)
except Exception as exc:
print("Error reading config file {}: {}".format(fp, str(exc)))
params = {}
else:
print 'no config file'
答
虽然我不能完全肯定这是否是Python的或没有,也许是这样的:
file_to_open = file1 if os.path.isfile(file1) else file2
这会导致竞争条件,加上'OSError'也可能是由于'PermissionError'等 –
不会吧无论如何,如果您尝试在没有适当的权限的情况下打开(fp,“r”)',就会得到'PermissionError'? – Vinny