2017-04-05 5 views
0

저는 텍스트 파일이있는 학교의 과제를 처리하고 있습니다 : data.txt는 다음과 같습니다 : ('name'대신 실제 이름이 여기에 대체되었습니다.)파이썬 중첩 루프가 의도 한대로 작동하지 않습니다.

10001-31021 'name' 2015.12.30. 524432 

10001-31121 'name' 2016.03.21. 765432 

10012-34321 'name' 2016.02.20. 231231 

10201-11021 'name' 2016.01.10. 2310456 

는 그리고 나는이처럼 보이는있는 Update.TXT 있습니다

2016.03.22. 
10001-31021 'name' +20000 

10012-34321 'name' +35432 

10012-34321 'name' -10000 

10120-0'name' +120334 

10001-31021 'name' +5000 

10210-41011 'name' -6000 

10201-11021 'name' +100210 

12345-32100 'name' +123456 

을 그리고있는 Update.TXT 포함 마지막 열의 변경에 따라 newdata.txt 파일을 확인해야합니다.

이 내 코드는 지금까지 있습니다 :

adat = open("data.txt", "r") 
newdata = open("newdata.txt", "w") 
update = open("update", "r") 

date = update.readline().decode("utf-8-sig").encode("utf-8").splitlines() 
num_lines = sum(1 for line in open('update')) 
elsociklus = 0 
masodikciklus = 0 

for num_lines in update: 
    updateData = re.search("(.{11}\t)(\D+\t)([+-]\d+)", num_lines) 
    elsociklus = elsociklus + 1 
    print("elsociklus: " + str(elsociklus)) 
    for j in adat: 
     data = re.search("(.{11}\t)(\D+\t)(\d{4}\.\d{2}\.\d{2}\.\t)(\d+)", j) 
     masodikciklus = masodikciklus + 1 
     print("masodikciklus: " + str(masodikciklus)) 
     if data != None: 
      if updateData.group(1) == data.group(1): 
       print("regi: " + data.group(0)) 
       print("update: " + updateData.group(0)) 
       print("uj: " + data.group(1) + data.group(2) + date[0] + "\t" + str(int(data.group(4)) + int(updateData.group(3)))) 
       newdata.write(data.group(1) + data.group(2) + date[0] + "\t" + str(int(data.group(4)) + int(updateData.group(3)))) 
       newdata.write("\n") 
      else: 
       print("nincs valtozas: " + data.group(0)) 

adat.close() 
newdata.close() 
update.close() 

내 문제는 중첩 된 루프입니다. 두 번째로 안쪽 루프에 들어가는 이유가 무엇인지 알 수 없습니다. 첫 번째 반복에서는 완벽하게 작동하지만 두 번째 루프를 바깥 쪽 루프에 입력하면 안쪽 루프가 무시됩니다.

도움을 주셔서 감사합니다.

+1

j 및 adat 값을 테스트 했습니까? 루프 카운터 (이 경우 j)가 목록의 범위를 벗어나면 루프가 실행되지 않습니다. 내 생각 엔 외부 루프를 통해 처음에는 adat을 끝까지 실행하고 내부 루프는 내부 ​​루프에 대한 파일의 끝에 이미 있음을 감지하는 것입니다. 해결책은 파일을 닫았다가 다시 열거 나 파일 포인터를 처음으로 다시 설정하는 것입니다. – codingCat

+0

나는 그 파일을 열고 반환 된 값을 저장한다는 것을 알게되었다. data.txt의 내용을 읽으려면 코드에서 adat.read() 또는 adat.readlines()가 보이지 않습니다. 그래서 당신은 무엇을 반복하고 있습니까? – DineshKumar

+0

루프 앞에'num_lines'를 설정하는 것은 무엇입니까? 이 값은 절대로 사용되지 않으므로 전체 파일을 읽는 데 불필요한 I/O가 발생합니다. – chepner

답변

0

해답은 codingCat입니다. 내 파일 포인터를 내 루프의 파일 시작 부분으로 반환하여 문제를 해결했습니다.