其他选项而不是使用try-except

时间:2018-05-20 07:37:41

标签: python file filter try-except

当文本文件中的第2行有'nope'时,它将忽略该行并继续下一行。是否有另一种方法来写这个没有使用尝试,除了?我可以使用if else语句来执行此操作吗?

文本文件示例:

0 1 
0 2 nope
1 3 
2 5 nope

代码:

e = open('e.txt')
alist = []
for line in e:
    start = int(line.split()[0])
    target = int(line.split()[1])
    try:
        if line.split()[2] == 'nope':
            continue
    except IndexError:
        alist.append([start, target])

5 个答案:

答案 0 :(得分:6)

是的,您可以使用str.endswith()方法检查行的尾随。

with  open('e.txt') as f:
    for line in f:
        if not line.endswith(('nope', 'nope\n')):
            start, target = line.split()
            alist.append([int(start), int(target)])

请注意,当您使用with语句打开文件时,您不需要明确关闭文件,文件将在块结束时自动关闭。

另一种更优化的解决方法是使用列表推导来拒绝在每次迭代时附加到列表中,并从与常规循环相比的性能中获益。

with open('e.txt') as f:
    alist = [tuple(int(n) for i in line.split()) for line in f if not line.endswith(('nope', 'nope\n'))]

请注意,由于您的代码因为将字符串转换为整数并拆分行等而异常,因此使用try-except更好,以防止代码出现可能的异常并处理它们正常。

with  open('e.txt') as f:
    for line in f:
        if not line.endswith(('nope', 'nope\n')):
            try:
                start, target = line.split()
            except ValueError:
                # the line.split() returns more or less than two items
                pass # or do smth else
            try:
                alist.append([int(start), int(target)])
            except ValueError:
                # invalid literal for int() with base 10
                pass # or do smth else

另一种Pythonic方法是使用csv模块来读取文件。在这种情况下,您不需要拆分行和/或使用str.endswith()

import csv
with open("e.txt") as f:
    reader = csv.reader(f, delimiter=' ')
    alist = [(int(i), int(j)) for i, j, *rest in reader if not rest[0]]
    # rest[0] can be either an empty string or the word 'nope' if it's
    # an empty string we want the numbers. 

答案 1 :(得分:3)

with open('e.txt', 'r') as f:
    alist = []
    for line in f:
        words = line.split()
        if len(words) > 2 and words[2] == 'nope':
            continue
        else:
            alist.append([int(words[0]), int(words[1])])

答案 2 :(得分:1)

  

我可以使用if else语句来执行此操作吗?

您应该使用if-else语句而不是异常来控制您期望的普通“事件”的流程。这是许多语言中常见的“规则”,我认为Python不会在这里引发异常,Python 是一个例外,但希望不会出现这种情况。< / p>

关注您的代码,但每次都不调用line.split(),删除try-except并使用if中的正确条件:

alist = []
with open('e.txt') as e:
    for line in e:
        splitted = line.split()
        if len(splitted) > 2 and splitted[2] == 'nope':
            continue
        else:
            alist.append([int(splitted[0]), int(splitted[1])])

当然,您可以否定条件并避免continue

if len(splitted) <= 2 or splitted[2] != 'nope':
    alist.append([int(splitted[0]), int(splitted[1])])

如果您的元素少于2个,则会显示(另一个)弱点。在这里你可以使用 try :在这种情况下的异常告诉你输入格式是错误的(因为你期望至少有2个元素,所以)你必须拒绝输入并警告用户。此外,如果这两个元素不是整数,您可以拦截ValueError

此外,如果允许您的输入包含额外的空格,您可以使用splitted[2].strip()之类的内容。

有关尝试 - 除外事项的SO / SE读物。

答案 3 :(得分:1)

如果nope不仅可以在该行的末尾,您可以使用此

with open('e.txt') as e:
    alist = [line.split() for line in e if 'nope' not in line]

print(alist)

答案 4 :(得分:0)

alist = []
with open('e.txt') as fin:
    for line in fin:
        rest_line, nope = line.strip().rsplit(' ', 1)
        if nope != 'nope':
            alist.append([int(rest_line), int(nope)])