2013-04-24 2 views
0

일부 조건에 따라 텍스트 파일을 읽고 라인별로 데이터를 검색하고 라인의 일부 값을 변경하여 다른 파일에 다시 쓰고 있습니다. 새 파일에는 이전 행이 없어야합니다. 나는 다음을 시도했지만 효과가 없었다. 나는 아주 기본적인 것을 놓치고 있다고 생각한다.라인을 파이썬의 새 라인으로 바꾸기

솔루션 : C++에서 우리는 라인을 증가시킬 수 있지만 파이썬에서는 이것을 달성하는 방법을 모르겠습니다. 그래서 지금은 새로운 라인보다 오래된 라인을 쓰고 있습니다. 그러나 새 파일에서는 새 행만 원합니다.

예 :

M0 38 A 19 40 DATA2 L=4e-08 W=3e-07 nf=1 m=1 $X=170 $Y=140 $D=8 
M0 VBN A 19 40 TEMP2 L=4e-08 W=3e-07 nf=1 m=1 $X=170 $Y=140 $D=8 

난이 시도하는 코드 다음

def parsefile(): 
    fp = open("File1", "rb+") 
    update_file = "File1" + "_update" 
    fp_latest = open(update_file, "wb+") 
    for line in fp: 
     if line.find("DATA1") == -1: 
      fp_latest.write(line) 
     if line.find("DATA1") != -1: 
      line = line.split() 
      pin_name = find_pin_order(line[1]) 
      update_line = "DATA " + line[1] + " " + pin_name 
      fp_latest.write(update_line) 
      line = ''.join(line) 
     if line.find("DATA2") != -1: 
      line_data = line.split() 
      line_data[1] = "TEMP2" 
      line_data =' '.join(line_data) 
      fp_latest.write(line_data) 
     if line.find("DATA3") != -1: 
      line_data = line.split() 
      line_data[1] = "TEMP3" 
      line_data =' '.join(line_data) 
      fp_latest.write(line_data) 

fp_latest.close() 
fp.close() 
+0

그것은 당신이 파이썬에서 파일을 작업 할 때, 그것을 사용하는 것이 가장 좋습니다 있음을 주목할 필요가 [은'with' 문 (http://www.youtube.com/watch?v=lRaKmobSXF4). –

+9

마찬가지로 문자열에 무언가가 존재하는지 확인하고 싶다면'line.find()'를 사용하는 대신'in line' 문자열을'if not "문자열을 사용하는 것이 가장 좋습니다. 또한 여기에 복사/붙여 넣기 코딩의 증상이 있습니다 - 당신은 약간 다른 변수로 여러 번 동일한 일을하고 있습니다 - 당신은 루프 및/또는 함수로 그 기능을 추출해야합니다. –

+1

'if line.find ("DAT1")! = -1 :'- 정말로 "DATA1"이 아니라 "DAT1"이겠습니까? 왜 그냥'else :'를 사용하지 않는가? – Vicky

답변

1

현재 코드의 주된 문제는 "DATA1"를 확인하고을 작성하여 제 if 블록 라인 아웃을 찾을 수없는 경우 "DATA2" 또는 "DATA3"이있을 때 실행됩니다. 그것들은 그들 자신의 블록을 가지고 있기 때문에, 라인은 두 가지 다른 형태로 중복됩니다.

for line in fp: 
    if line.find("DATA1") != -1: 
     data = line.split() 
     pin_name = find_pin_order(data[1]) 
     line = "DATA " + data[1] + " " + pin_name 
    if line.find("DATA2") != -1: 
     data = line.split() 
     data[1] = "TEMP2" 
     line =' '.join(data) 
    if line.find("DATA3") != -1: 
     data = line.split() 
     data[1] = "TEMP3" 
     line =' '.join(data) 

    fp_latest.write(line) 

이 코드에서 하나의 write() 호출 만이 있기 때문에 한 줄에 기록되는 것을 보장 :

여기에 작동해야 루프의 최소한의 수정입니다. 특수한 경우는 단순히 기록 할 행을 수정하십시오. 이러한 경우에 수행하려는 수정 사항을 이해할 수 있는지 확신 할 수 없으므로 더 많은 버그가있을 수 있습니다.

두 번째 및 세 번째 if 문을 elif 문으로 대신 작성하는 것이 좋습니다. 이렇게하면 둘 중 하나만 실행됩니다. 단, 파일에 한 줄에 여러 개의 DATA 항목이 없으면 필요하지 않을 수도 있습니다.

1

마지막으로 읽은 이전 내용을 대체하는 파일에 새 줄을 쓰려면 파일을 arround로 이동하는 데 file.seek() 메서드를 사용할 수 있습니다. 예가 있습니다.

with open("myFile.txt", "r+") as f: 
    offset = 0 
    lines = f.readlines() 
    for oldLine in lines: 
      ... calculate the new line value ... 
      f.seek(offset) 
      f.write(newLine) 
      offset += len(newLine) 
      f.seek(offset) 
관련 문제