2016-11-14 1 views
0

각 줄을 파일 맨 아래로 이동하려고합니다. 구문 분석의 마지막에 따라서파일을 구문 분석하고 끝에 각 줄을 추가하고 상단에서 줄을 제거하십시오.

daodaos 12391039 
idiejda 94093420 
jfijdsf 10903213 
.... 
#completed 

, 나는 #이 완료라는 실제 문자열에서 상단에있는 모든 항목을 얻을 계획입니다 :이 같은 파일 모습 방법이다.

문제는 한 번에이 작업을 어떻게 수행 할 수 있는지 잘 모르겠습니다. 나는 모든 파일, 모든 단일 라인을 읽고 파일을 닫은 다음 쓰기 모드에서 파일을 다시 열 수 있음을 안다. 그 라인을 검색하고, 그것을 파일로부터 제거하고 그것을 마지막에 추가하는 것; 그러나 그것은 비능률적으로 느낀다.

한 줄에 현재 행을 처리하는 방법이 있습니까? 그런 다음 동일한 for 루프에서 해당 줄을 삭제하고 파일 끝에 추가하십시오.

file = open('myfile.txt', 'a') 
for items in file: 
    #process items line 
    #append items line to the end of the file 
    #remove items line from the file 
+0

을 읽는 동안 그것을 간단한 읽기를 유지하고 아래

with open('myfile.txt') as f: lines = f.readlines() with open('myfile.txt', 'w') as f: newlines = [] for line in lines: # do you stuff, check if completed, rearrange the list if line.startswith('#completed'): idx=i newlines = lines[idx:] + lines[:idx] break f.write(''.join(newlines)) # write back new lines 

을 후기 입하는 것이 좋습니다? 또는 #completed 파일 맨 위로 이동시킬 수 있습니까? – Skycc

+0

후자; 일단 모든 것이 끝나면; 종료 조건이 있기 때문에 루프가 #completed에서 중지됩니다. –

답변

0

내가 싶어 수정을 주장하는 경우 생각할 수있는 또 다른 버전이 다시 같은 파일을 생성하지 않는

with open('myfile.txt', 'r+') as f: 
    newlines = '' 
    line = True 
    while line: 
     line = f.readline() 
     if line.startswith('#completed'): 
      # line += f.read() # uncomment this line if you interest on line after #completed 
      f.truncate() 
      f.seek(0) 
      f.write(line + newlines) 
      break 
     else: 
      newlines += line 
0

실제로는 아닙니다.

여기에서 가장 중요한 문제는 파일을 변경하고 싶을 때 파일을 반복하고 있다는 것입니다. 파일 위치 포인터를 미세하게 관리하지 않는 한,이 작업을 통해 Bad Things (tm)를 처리합니다.

당신은 그 힘을 가지고 있습니다 : seek 메서드를 사용하면 지정된 파일 위치로 바이트 단위로 이동할 수 있습니다. seek (0)은 파일의 시작 부분으로 이동합니다. 끝까지 찾기 (-1). 당신이 직면 한 문제는에 대한 루프가이 포인터가 다음에 읽을 라인을 가리킨다 고 신뢰한다는 것입니다.

뚜렷한 문제 중 하나는 파일 중간에서 한 줄만 제거 할 수 없다는 것입니다. 무언가이 해당 바이트에 있습니다. 연필로 쓰여진 페이지에 텍스트 줄로 생각하십시오. 4 번 줄을 지울 수는 있지만, 5 번 줄이 마술처럼 반 센티미터 위로 떠오르는 것은 아닙니다. 그들은 여전히 ​​같은 물리적 위치에 있습니다.

는이 작업을 수행하는 방법에 ...

의 종류를 목록으로 라인을 모두 읽어보십시오. 목록을 원하는대로 쉽게 변경할 수 있습니다. 끝까지 치면 목록을 파일에 다시 쓰거나 마법 을 찾아 개의 숫자를 추가하여 조금만 변경하십시오.

+0

감사합니다. 데이터 무결성을 유지하기 위해 2 패스 접근 방식을 사용하는 것 외에는 다른 방법이 없다고 생각했습니다. (뭔가 잘못되어 손상된 경우).2 개의리스트를 추가 할 수 있는데 하나는 파일을 추적하고 다른 하나는 출력 파일을 다시 작성합니다. 각 루프마다 새 파일을 작성하십시오. 이 방법으로 나는 근원을 손질하지 않고 유지한다. –

0

모든 파일을 읽고 변수에 저장하고 완성 된 파일을 다른 변수로 옮긴 다음 파일을 다시 작성하는 간단한 방법으로 권장합니다.

관련 문제