2009-09-25 5 views
2

파일 쓰기를 실행 취소하는 가장 좋은 방법은 무엇입니까? 루프를 반복하면서 한 번에 한 줄 씩 작성하고 이전 쓰기를 취소하고 다른 것으로 바꾸려면 어떻게해야합니까? 어떤 아이디어?파이썬 : 파일에 쓰기 실행 취소

미리 감사드립니다.

+1

왜이 작업을 원하십니까? 배경 컨텍스트를 제공 할 수 있습니까? –

+2

"안녕하세요, 저는 발에 몸을 던졌습니다. 고통을 없애기 위해 이것을 치료하는 가장 좋은 방법은 무엇입니까?" 대답? 발에 몸을 쏘지 마라. 이것이 당신이하고 싶은 일을 알기 전까지는 파일에 라인을 쓰지 마십시오. –

+0

@Sridhar Ratnakumar : 저는 각 행에 관련 정보가있는 파일을 생성하기 위해 분석 할 방대한 양의 데이터가 있습니다. 그러나 주어진 행에 이전 행과 동일한 정보가 들어 있으면 다른 형식으로 작성해야합니다. 소스 데이터가 거대하다는 것을 감안할 때, 나는 그것을 한 줄씩 처리하고 싶다. 이게 말이 돼? – aspade

답변

4

파일에 편지 쓰기 지연적으로 : 마지막으로 수행해야 할 때까지 작성하지 마십시오.

+0

그래, 그건 하나의 옵션 이었지만 많은 양의 데이터를 처리하고 있었고 플러시 될 때까지 메모리의 작은 부분 집합을 유지하려고했다. – aspade

+0

이 경우 작은 하위 집합은 쓰기를 대기중인 * one * 줄입니다. –

+0

사랑하기를 원합니다 !!! 이것은 내가하고 싶은 방식입니다, 불행히도 저는 서브 프로세스에서 돌아 오는 데이터를 가지고 있습니다. 호출을 열어 파일에 직접 파이프해야합니다. – gunslingor

0

당신이 줄 번호를 추적하는 경우는 다음과 같이 사용할 수 있습니다 : 아마도

from itertools import islice 
def seek_to_line(f, n): 
    for ignored_line in islice(f, n - 1): 
     pass # skip n-1 lines 


f = open('foo') 
seek_to_line(f, 9000) # seek to line 9000 


# print lines 9000 and later 
for line in f: 
    print line 
+0

@ennuikiller : 나는 똑같은 생각을하고 있었지만 그게 가장 좋은 방법인지는 확신이 들지 않았습니다. 가끔은 당신이 일하는 것을하고, 멋지거나 그렇지 않은 것에 대해 걱정하지 않아야한다고 생각합니다. – aspade

0

당신이 확신하는 경우에만 라인을 쓸 수 있도록 프로그램을 수정하는 것입니다 할 수있는 더 좋은 일을 그것을 쓰고 싶습니다. 코드가 같은 것을 볼 것이라는 점을하려면 :

다른 사람이 언급 한 것처럼
to_write = "" 
for item in alist: 
    #Check to make sure that I want to write 
    f.write(to_write) 
    to_write = "" 
    #Compute what you want to write. 
    to_write = something 

#We're finished looping so write the last part out 
f.write(to_write) 
5

이 훨씬 이해가되지 않습니다를, 그것은 당신이 때까지 훨씬 잘 작성하지 않습니다. 귀하의 경우에는 처리 라인 뒤에 '쓰기 포인터'를 한 줄씩 올릴 수 있습니다.

의사 :

previousItem = INVALID 
for each item I: 
    is I same as previousItem? 
    then update previousItem with I 
    else 
     write previousItem to file 
     previousItem = I 
write previousItem to file 

당신이 볼 수 있듯이, previousItem 유일한 항목이 메모리에 저장하고,이를 필요에 따라 '축적'에 업데이트됩니다. 다음 파일이 그 파일과 동일하지 않을 때만 파일에 기록됩니다.

물론 파일 커서를 롤백하고 마지막 줄이 시작된 바이트 오프셋을 추적 한 다음 다시 쓰기 전에 fseek()을 수행 할 수 있습니다. 처음에는 코드 작성이 더 간단 해 보일 수 있지만 디버깅은 완전히 악몽입니다.

4

앞서 언급했듯이 쓰기를 실행 취소하지 않는 것이 가장 좋습니다. 당신이 정말하고 싶은 경우에, 그러나, 그것은 쉽게 충분하다 :

import os 
f = open("test.txt", "w+") 
f.write("testing 1\n") 
f.write("testing 2\n") 
pos = f.tell() 
f.write("testing 3\n") 

f.seek(pos, os.SEEK_SET) 
f.truncate(pos) 
f.write("foo\n") 

그냥 파일 위치, 다시로 추구 되감기 기록하고 그 위치에 파일을 자릅니다.

이 작업의 주요 문제점은 스트림에서 작동하지 않는다는 것입니다. stdout이나 파이프 나 TCP 스트림에는 이것을 할 수 없습니다. 실제 파일에만 적용됩니다.