3

Python で StopIteration エラーを処理する方法に関する一連の投稿を読んだところですが、特定の例を解決するのに苦労しました。基本的に、多くのプレフィックスを含む csv ファイルがあります。このファイルには、ヘッダー付きの 2 つの列 (Word と Count) があります。カウントは、そのプレフィックスが発生する頻度です。会社名のリストを含む別のファイルもあります。プレフィックス ファイルは、会社ファイル内の各会社名の最初の単語からプレフィックスを取得しました。重複を削除しようとしていますが、今やりたいことは次のとおりです。

このエラーが発生するたびに StopIteration エラーを無視します。

つまり、コメントアウトされたすべての「if」ステートメントを以下に記述する代わりに、「StopIteration エラーが発生した場合は単にエラーを無視する」という 1 行が必要です。接頭辞ファイルに 2 回以上出現する接頭辞であったため、接頭辞を含めずに会社名の値を返す必要があります。これは、プレフィックスファイルと会社名の実際のプレフィックスに異なるプレフィックス値があるという事実を無視していることに気付きましたが、通常、Python と Excel の間で異なる方法で保存されたアメリカ英語以外の文字と関係があります。特に体系的とは思えない方法なので、後で手動で削除します。

私のコードは次のとおりです。

def remove_prefix(prefix, first_name):
   #try:
   #EXCEPTIONS:
   #if '(' in prefix:
   #    prefix = prefix[1:]
      #if ')' in prefix:
    #  prefix = prefix[:-1]
    """
      if prefix == "2-10":
        prefix = "2"
      if prefix == "4:2:2":
        prefix = "4"
      if prefix == "5/0" or prefix == "5/7" or prefix == "58921-":
        prefix = "5"
    """
    #except StopIteration:
   #    pass

   print(first_name, prefix)
   input_fields = ('Word', 'Count')
   reader = csv.DictReader(infile1, fieldnames = input_fields)
   #if the prefix has a frequency of x >=2 in the prefix file, then return first_name  without prefix
   #else, return first_Name
   infile1.seek(0)
   #print(infile1.seek(0))
   next(reader)
   first_row = next(reader)
   while prefix != first_row['Word'] and prefix[1:]!= first_row['Word']:
      first_row = next(reader)
      #print(first_name, prefix)
      #print(first_row, first_name, prefix, '\t' + first_row['Word'], prefix[1:])
   if first_row['Count'] >= 2:
      length = len(prefix)
      first_name = first_name[length+1:]
  #print("first name is ", first_name)
  return first_name
4

2 に答える 2

3

これは、あなたが考えていることが原因であるとは思いません。StopIteration 例外は、ジェネレーター ( reader) が読み取る行がなくなると発生します。

例えば:

def g():
    "generates 1 (once)"
    yield 1

a = g()
next(a) # is 1
next(a) # StopIteration exception (nothing left to yield)

これを修正するnextには、(pass) を除いて、try でラップすることができます:

while prefix != first_row['Word'] and prefix[1:]!= first_row['Word']:
    try:
        first_row = next(reader)
    except StopIteration:
        pass

しかし、David が指摘しているように、これはおそらくあなたがこれに取り組むべき方法ではありません。

于 2012-08-31T19:47:07.627 に答える
2

これは、最初にファイルからプレフィックスのリストを作成し、次にそれぞれに対してメソッドを使用することで、はるかに簡単な方法で実行できますstartswith。例えば:

reader = csv.DictReader(infile1)
# # this is assuming there are only two columns in the file: Word and Count
prefixes = [l["Word"] for l in list(reader) if int(l["Count"]) >= 2]

def remove_prefix(first_name):
    for p in prefixes:
        if first_name.startswith(p):
            return first_name[len(p):]
    return first_name

それはもっと簡単ではないでしょうか?もう 1 つの利点は、置換する単語ごとにファイルを再度開くのではなく、一度だけファイルを読み取ることです。

于 2012-08-31T19:39:49.950 に答える