如何不使用try-except,改用if-else处理含'nope'的文本行?
当然可以用if-else替代try-except实现需求,而且代码会更健壮可读!
你的需求是忽略包含'nope'的行,提取其余行的start和target值存入列表,用if-else完全可以实现,甚至能避免原代码里的潜在问题。
先聊聊原代码的小瑕疵:
- 同一行重复调用了三次
line.split(),有点浪费性能 - 如果某行的第一个元素不是数字(比如开头就是'nope'),
int(line.split()[0])会直接抛出ValueError,原代码没处理这个情况 - 用try-except来处理“正常分支”(大部分行没有nope),其实不太符合Python里“EAFP(先尝试后捕获)”的适用场景——EAFP更适合处理罕见的异常情况,而这里的“是否包含nope”是可预见的分支逻辑
优化后的if-else版本代码
alist = [] # 用with语句自动管理文件关闭,更安全省心 with open('e.txt') as e: for line in e: # 先去除首尾空白(包括换行符),再分割成元素列表,只调用一次split parts = line.strip().split() # 只要行里包含'nope',直接跳过该行 if 'nope' in parts: continue # 确保剩下的是两个有效元素,避免索引越界 if len(parts) == 2: try: start = int(parts[0]) target = int(parts[1]) alist.append([start, target]) except ValueError: # 可选:处理元素不是数字的情况,避免程序崩溃 print(f"跳过无效行:{line.strip()}")
代码逻辑说明
with语句管理文件:无需手动调用close(),文件会在代码块结束后自动关闭,避免资源泄漏- 一次分割多次用:把每行分割后的结果存入
parts变量,避免重复调用split()浪费性能 - 直接判断'nope'存在性:不管'nope'在该行的哪个位置,只要存在就跳过,完全匹配你的需求
- 校验元素数量:确保剩下的行有且只有两个元素,再尝试转换为整数,从根源避免索引越界错误
- 可选的数字校验:加入
try-except ValueError处理非数字的情况,让代码更健壮
如果你的文本文件里'nope'固定出现在第三个位置(像示例那样),也可以简化判断为:
alist = [] with open('e.txt') as e: for line in e: parts = line.strip().split() # 仅当行有3个元素且第三个是'nope'时跳过 if len(parts) == 3 and parts[2] == 'nope': continue elif len(parts) == 2: start = int(parts[0]) target = int(parts[1]) alist.append([start, target])
不过这种方式只适用于'nope'位置固定的场景,用'nope' in parts的判断更通用,能覆盖所有包含'nope'的行。
内容的提问来源于stack exchange,提问作者Hal
相关产品推荐
相关产品推荐

