1

SO私は2列のテキストファイルを読んでいますn

 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)

失敗する方法は2つあるため、これを2つの別個の例外ハンドラーに分割しました。あなたは実際にそれを次のように折りたたむことができます:

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)

それは同じ例外であり、それらは互いに接近して発生するためです。個人的には、2種類のエラーがあることを明確にするために前者の方が好きです。あなたがしてはいけないことは次のとおりです。

# !!! 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例外ハンドラーのスイートをできるだけ小さくして、1つのエラーのみをキャッチし、エラーが見つけやすい場所にします。

于 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 foo.strip() != "":
    foo = int(each_line[0])
else:
    ???
于 2012-04-12T19:15:35.857 に答える
0

これは、それらが空かどうかをテストします (文字列であると仮定します):

if not foo or not bar:
    continue
于 2012-04-12T19:14:22.797 に答える