1

繰り返し文字列 (トランザクション ID) のリストをコンパイルします。私は困惑しています。正しい方法を調査したところ、このコードが機能するはずだと感じています。ただし、2番目のブロックで何か間違ったことをしています。この最初のブロックは、必要な文字列のリストを正しくコンパイルします。

この 2 番目のブロックを機能させることができません。単純化すると、次を使用してリスト内の各値を出力できます

for idx, val in enumerate(tidarray): print val

その値を使用して各行でその文字列を検索し、その行を出力できるようになったようです (実際には、別の検索用語と組み合わせて使用​​して行の読み取り数を減らしますが、これは私のさらに磨きをかける前の基本的なテスト。

def main():
    pass

samlfile= "2013-08-18 06:24:27,410 tid:5af193fdc DEBUG org.sourceid.saml20.domain.AttributeMapping] Source attributes:{SAML_AUTHN_CTX=urn:oasis:names:tc:SAML:2.0:ac:classes"
tidarray = []

for line in samlfile:  

    if "tid:" in line:
        str=line
        tid = re.search(r'(tid:.*?)(?= )', str)
        if tid.group() not in tidarray:
            tidarray.append(tid.group())

for line in samlfile:
    for idx, val in enumerate(tidarray):
        if val in line:
            print line

誰かが 2 番目のコード ブロックの修正を提案できますか? ファイルを 2 回読み取ることは、最も洗練された解決策ではないことは認識しています...ここでの主な目標は、リストを列挙し、後続のコードで各値を使用する方法を学ぶことです。

4

1 に答える 1

1

ファイルを 2 回繰り返す

基本的にあなたがすることは次のとおりです。

for line in somefile: pass # first run
for line in somefile: pass # second run

最初の実行は問題なく完了しますが、2 回目の実行はまったく実行されません。これは、ファイルが最後まで読み取られ、行を読み取るデータがなくなったためです。somefile.seek(0)ファイルの先頭に移動するために呼び出します。

for line in somefile: pass # first run
somefile.seek(0)
for line in somefile: pass # second run

物を一意に保管する

基本的に、あなたが望んでいるように見えるのは、ファイルからのIDをデータ構造に格納する方法であり、すべてのIDはその構造に1回だけでなければなりません。

要素を一意に格納する場合は、辞書 ( help(dict)) やセット ( ) などを使用しますhelp(set)。セットの例:

myset = set()
myset.add(2)  # set([2])
myset.add(3)  # set([2,3])
myset.add(2)  # set([2,3])
于 2013-10-19T02:31:52.130 に答える