2016-12-12 14 views
0

このスクリプトはファイルを読み込み、数字(numA)とその隣のテキスト(sourceA)を取ります。次に、これを使用して、ファイル内の他のすべての行と比較します。 「NUMS」で一致するものがなく、ソースに発見された場合、それはで表示されますソースと一緒にファイルにNUMを書き込みます。forループでネストされたPythonは最初から実行されません

with open(sortedNums, "r")as sor: 
for line in sor: 
    NumsA, sourceA = line.split('####') 
    for line in sor: 
     if '####' in line: 
      NumsB, sourceB = line.split('####') 
      if (NumsA == NumsB) & (sourceA != sourceB): 
       print("Found reused Nums") 
       with open(reusedNums, 'a')as reused: 
        reused.write(NumsA + ' ' + sourceA + ' ' + sourceB) 
      print ("setA: " + NumsA + ' ' + sourceA) 
      print ("setB: " + NumsB + ' ' + sourceB) 

これのほとんどは、それが完全な内部ループを行うことを除いて取り組んでいるが、外側ループの最初の反復のみ

+2

読み取り位置をリセットせずにファイルを繰り返しループすることはできません。 'sor.seek(0)'を追加してください。 –

+0

入力ファイルのサンプルを含めます。 – MYGz

+0

また、 '&'は*ブール型ではありません。それは*バイナリのビットと演算子*です。あなたは 'と'を使いたいと思う。 –

答えて

1

同じファイルから2回読み取ろうとしています。ファイルは現在の位置を使用して次に読み取るものを決定し、内側のループの残りの行を繰り返し、その位置を最後まで移動しました。

あなたは背中とファイルの先頭に求めていることであること「修復」ことができます:

sor.seek(0) 

しかし、そのファイル内のすべての行のためにファイル全体をループ本当に非効率的です。あなたが前の行に同じ情報を見ている場合は追跡するための辞書を使用します。

with open(sortedNums, "r")as sor, \ 
    open(reusedNums, 'a') as reused: 
    seen = {} 
    for line in sor: 
     if not '####' in line: 
      continue 
     nums, source = line.rstrip().split('####') 
     if nums in seen and seen[nums] != source: 
      print("Found reused Nums") 
      reused.write('{} {} {}\n'.format(nums, source, seen[nums])) 
     seen[nums] = source 

辞書にデータを保存することで、あなただけのファイルをループに一度を持っています。

+0

私はPythonの初心者です。 'seen [nums] = source'が何をしているのかを説明できます –

+0

これは辞書にキーと値のペアを設定します。 [Pythonチュートリアル](https://docs.python.org/3/tutorial/datastructures.html#dictionaries)を参照してください。 –

+0

最後の行でエラーが発生しました。これは 'dictionary [key] = value'の構造に従いますが、構文エラーを返します。これはPython 3の問題だろうか?または私は何かを逃していますか? –

関連する問題