2012-05-28 3 views
1

저는 PyGTK를 배우고 있습니다. (pygtk : 안녕하세요. pygtk : 안녕하세요.) 어쨌든, 저는 "Save"함수를 써서 TextBuffer를 파일에 적용합니다. 보이는 것 같습니다.Python open() 모드 및 파일 쓰기

try: 
    f = open(self.working_file_path, "rw+") 
    buff = self._get_buffer() 
    f.write(self._get_text()) 
    #update modified flag 
    buff.set_modified(False) 
    f.close() 

except IOError as e: 
    print "File Doesnt Exist so bring up Save As..." 
    ...... 

기본적으로 파일이있는 경우 버퍼를 작성하고 다른 이름으로 저장 대화 상자를 표시하십시오.

내 질문은 : 파일을 "업데이트"하는 가장 좋은 방법은 무엇입니까? 나는 파일의 끝에 추가 할 수있을 것만 같다. 다양한 파일 모드를 시도했지만 무언가를 놓치고 있다고 확신합니다.

미리 감사드립니다.

답변

3

파일에 쓸 때 파일의 끝에 위치하므로 처음으로 다시 탐색해야합니다. 그런 다음 파일을 덮어 쓰지 만 마지막에는 오래된 내용이 남을 수 있으므로 파일을 잘라야합니다.

또한 지정한 모드 ('rw+')가 유효하지 않으며 열어 본 파일에 대해 일부 작업을 수행 할 때 IOErrors가 발생합니다. 'r+' ("Open for reading and writing. 스트림이 파일의 시작 부분에 위치합니다."라고 말합니다.). 'w+'은 비슷하지만 존재하지 않는 파일을 만듭니다.

그럼, 당신이 찾고있는 것은 다음과 같은 코드가 될 수 있습니다 그러나

try: 
    f = open(self.working_file_path, "r+") 
    buff = self._get_buffer() 
    f.seek(0) 
    f.truncate() 
    f.write(self._get_text()) 
    #update modified flag 
    buff.set_modified(False) 
    f.close() 

except IOError as e: 
    print "File Doesnt Exist so bring up Save As..." 
    ...... 

, 당신은 절단하고 파일을 쓰기보다는 가정 동안 제대로 잡아 오류를 처리하는 코드를 수정할 수 있습니다 이 섹션의 모든 IOError는 open에 대한 호출에서 존재하지 않는 파일 오류입니다.

+0

f.truncate()가 나를 위해이 작업을 수행했습니다. –

0

파일을 목록으로 읽은 다음 요소를 시작 부분에 추가하고 모두 쓰십시오. 이 같은.

f = open(self.working_file_path, "r+") 
flist = f.readlines() 
flist.insert(0, self._get_text()) 
f.seek(0) 
f.writelines(flist) 
+3

그런 코드에는'with' 구문을 사용해야합니다. – Voo

+0

-1'IOError [Errno 9] 파일 디스크립터가 잘못되었습니다. ' –

+0

나는 OP의 rw +를 r +보다는 복사하기 때문에 그렇게 생각한다. 결정된. – sajattack

6

당신 당신이 파일을 읽고 쓰기를 모두 할 수 있습니다 "r+" 모드로 파일을 열 수 있고, 특정 위치로 추구하고 거기에 쓸 수 있습니다. 이것은 아마 당신이 내가 생각하는 것을하는 데 도움이되지 않습니다. 변경된 데이터 만 쓰기를 원하는 것 같습니다.

파일이 일련의 확장 가능 라인으로 저장되지 않는다는 것을 기억하십시오. 이는 단지 바이트 시퀀스입니다. 이러한 바이트 중 일부는 행 끝을 나타내지 만 다음 행은 바로 다음에옵니다. 따라서 파일의 첫 번째 행을 편집하고 새로운 첫 행을 쓴 경우, 새로운 행이 정확히인데, 이전 행과 동일한 길이가 아닌 경우 두 번째 행은 이제 올바른 위치에 있지 않습니다. 당신이 그것을 옮길 필요가있을 것입니다. 그리고 당신이 쓴 라인이 원본보다 길다면 먼저 복사본을 가져 왔습니다. 그리고 이것은 이제 다음 줄이 올바른 위치에 있지 않다는 것을 의미합니다 ... 그리고 파일의 나머지 부분을 모두 읽고 쓸 때까지 계속됩니다.

단순히 더 많은 데이터를 추가 할 수 없다면 기존 파일의 일부만 작성하는 경우는 거의 없습니다. 읽은 파일을 "변경"하고 메모리에서 변경 한 다음 또는을 파일로 읽고 (종종 한 줄씩) 파일을 읽고 나서 파일에 쓰십시오 가서 원래 파일 위로 새로운 파일을 옮길 수도 있습니다. 첫 번째 방법은 가장 쉽고 두 번째 방법은 모든 것을 한 번에 메모리에 보관할 필요가 없다는 점에서 더 좋습니다.

+0

위대한 설명! –