2016-12-12 1 views
0

이 스크립트는 파일을 읽고 숫자 (numA)와 그 옆에있는 텍스트 (sourceA)를 가져옵니다. 그런 다음이 파일을 사용하여 파일의 다른 모든 행과 비교합니다. "nums"에서 일치가 발견 될 수 있지만 소스에, 그것이 나타납니다 소스와 함께 파일로 납입을 기록합니다.파이썬이 for-loop를 처음부터 넘어서 실행하지 않습니다.

이 대부분은 전체 내부 루프 않는다는 점을 제외하고있다
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

또한,'&'는 *가 아닌 * 부울'과'; 그건 * 2 진 비트와 연산자 *입니다. 'and'를 사용하고 싶습니다. –

답변

1

동일한 파일에서 두 번 읽으려고합니다. 파일은 현재 위치을 사용하여 다음에 읽을 내용을 결정하고 내부 루프의 나머지 줄을 반복하여 그 위치를 끝까지 이동했습니다.

당신은 다시 사용하여 파일의 시작 추구가 있음을 '해결'할 수 :

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

저는 파이썬을 처음 사용합니다. 'seen [nums] = source'가 무엇을하는지 설명해주십시오. –

+0

사전에 키 - 값 쌍을 설정합니다; [Python 튜토리얼] (https://docs.python.org/3/tutorial/datastructures.html#dictionaries)을 참조하십시오. –

+0

임 마지막 줄에 오류가 발생했습니다. 'dictionary [key] = value'의 구조를 따르지 만 문법 오류를 돌려줍니다. 이것이 파이썬 3 문제일까요? 또는 나는 무엇인가 놓치고 있냐? –

관련 문제