1

所以我正在阅读一个包含 2 列的文本文件

 foo, bar

所以我做了类似的事情

for each_line in f:
   each_line = each_line.split(',')
   foo = int(each_line[0])
   bar = int(each_line[1]
   foobar = FooBar(foo,bar)
   foobar_list.append(foobar)

现在,有时 foo 或 bar 是空白的.. 因此不能被类型转换为 int.. 有没有办法如果 foo 或 bar 为空的东西我可以跳过这个功能

(没有附加到食物栏)但是循环仍然继续进行?

4

4 回答 4

7

有几个地方可能会失败,如果 each_line 没有足够的逗号,或者任何一个值都不是数字(例如,一个空字符串)。在每种情况下,您都可以捕获错误并使用以下内容continue跳至下一项f

for each_line in f:
   try:
       foo_line, bar_line = each_line.split(',')
   except ValueError:
       # "Too many/few values to unpack" meaning wrong number of commas!
       continue
   try:
       foo, bar = int(foo_line), int(bar_line)
   except ValueError:
       # "invalid literal for int()" meaning it wasn't digits
       continue
   foobar = FooBar(foo,bar)
   foobar_list.append(foobar)

我将其分解为两个独立的异常处理程序,因为它有两种不同的失败方式。你实际上可以像这样折叠它:

for each_line in f:
   try:
       foo_line, bar_line = each_line.split(',')
       foo, bar = int(foo_line), int(bar_line)
   except ValueError:
       # there was invalid input.
       continue
   foobar = FooBar(foo,bar)
   foobar_list.append(foobar)

因为这是同一个例外,而且它们发生的很近。就个人而言,我更喜欢前者,以明确指出有两种错误。你不应该做的是:

# !!! BAD !!!
for each_line in f:
    try:
        each_line = each_line.split(',')
        foo = int(each_line[0])
        bar = int(each_line[1]
        foobar = FooBar(foo,bar)
        foobar_list.append(foobar)
    except ValueError:
        continue

因为FooBar()甚至foobar_list.append()可能失败,但异常处理程序可以吞下它;始终使try:yoru 异常处理程序中的套件尽可能小,以便它们只捕获一个错误,并且很容易找到错误所在的位置。

于 2012-04-12T19:28:22.697 回答
1

这是异常处理的一个例外示例

for each_line in f:
   each_line = each_line.split(',')
   try:
       foo = int(each_line[0])
       bar = int(each_line[1]
       foobar = FooBar(foo,bar)
       foobar_list.append(foobar)
   except ValueError:
       None
于 2012-04-12T19:19:50.410 回答
0

这测试它们是否为空(假设它们是字符串):

if not foo or not bar:
    continue
于 2012-04-12T19:14:22.797 回答
0

以防万一零件只有空格:

if foo.strip() != "":
    foo = int(each_line[0])
else:
    ???
于 2012-04-12T19:15:35.857 回答