我正在读取一个文件并使用try catch来捕获数据可能不是我正在寻找的类型的情况:
for w in text.readlines():
try:
new = float(w.split()[3].replace(',', '.'))
if new < temp and w.split()[1][3:5] == '12':
temp = new
date = w
except ValueError:
''
except IndexError:
''
这实际上是一个hacky解决方案,不是我会使用的东西,只是我写的东西,因为我需要快速访问一些数据。但是,如果我想解析一个非常大的文件或流,那么这样的解决方案(修改以便更智能地调用等)是可行的,或者应该选择其他解决方案。我的主要问题是关于try catch的性能,是否是一个昂贵的操作,并且是否有良好的try-except使用指南?希望这个问题不是太宽泛。如果是的话,请关注我的例子。
答案 0 :(得分:1)
我不能说太多,因为我不是专家,但在任何编码语言中使用try except
会更好,因为您似乎代码可能会产生一些错误,并且在python词汇表中
EAFP规则清楚地说明了这一点。
比许可更容易请求宽恕。这种常见的Python编码风格假设存在有效的键或属性,并且如果假设被证明是错误则捕获异常。这种干净和快速的风格的特点是存在许多try和except语句。该技术与许多其他语言(例如C。
)共有的LBYL风格形成对比for w in text.readlines():
try:
new = float(w.split()[3].replace(',', '.'))
if new < temp and w.split()[1][3:5] == '12':
temp = new
date = w
except ValueError:
Do Something
except IndexError:
Do Something
except Exception: #Exception is a Base class of all exceptions if any exception that isn't catch will go in it,
Do Something
答案 1 :(得分:1)
在您给出的特定示例中,您可以轻松地测试并避免IndexError案例,因此我会进行该测试。 ValueError更难检查,因此您应该捕获异常。
for w in text:
words = w.split()
if len(words) >= 4:
try:
new = float(words[3].replace(',', '.'))
if new < temp and words[1][3:5] == '12':
temp = new
date = w
except ValueError:
pass
不要在文件上使用readlines()
,而应该只是迭代文件。
如果在检查之前检查或处理异常同样容易,那么一个好的经验法则是考虑抛出异常的频率。如果在正常情况下异常触发非常罕见,那么只需处理它,另一方面如果它是常见的情况,那么最好避免抛出它。由于我对您的数据一无所知,因此我不知道有多少行会少于4个字段,因此在这种情况下选择非常随意。