답변:
경쟁 조건을 피하기 위해 파일을 닫았다가 다시 열지 않으려면 다음과 같이 할 수 truncate있습니다.
f = open(filename, 'r+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.truncate()
f.close()
기능은 또한 오류가 발생하더라도 파일 처리기를 닫는 컨텍스트 관리자로 사용 하면 더 깨끗하고 안전open 합니다!
with open(filename, 'r+') as f:
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.truncate()
f.write(text)가 앞에 f.truncate()있습니다. text첫 번째를 작성 하므로 .write()파일 커서가 text. 파일 자르기를 진행하면이 시점 이후에 파일에 남아있을 수있는 모든 바이트가 제거됩니다. 이 경우 최종 결과는 쓰기 전에 잘린 것과 동일합니다.
fileinput모듈 이 선호되는 방법이 될 수 있습니다. 전달되면 inplace=1먼저 파일을 임시 위치로 이동 한 다음 이전 파일 이름 경로에 새 파일을 씁니다. 이 이동 작업은 inode전체 내용이 아닌 파일 시스템을 이동하기 때문에 유닉스 파일 시스템에서 빠릅니다 . 그런 다음 메모리 팽창을 방지하기 위해 각 줄을 개별적으로 읽고 처리 할 수 있습니다. :-)
fileinput모듈은이 inline투명하게 파일 이름을 추적 오브젝트를 통해, 모듈 멋지게 파일 목록의 라인을 통해 루프의 공동 작업을 캡슐화 임시 파일을 사용하는 등없이 당신이 처리하는 파일에 대한 변경 사항을 작성하기위한 모드 루프 내에서 검사해야하는 경우 줄 번호 등.
import fileinput
for line in fileinput.FileInput("file",inplace=1):
if "foobar" in line:
line=line.replace("foobar","bar")
print line
솔직히 기본 파일 작업을 수행하는이 클래스를 살펴볼 수 있습니다. 쓰기 방법은 이전 데이터를 덮어 쓰고 추가합니다.
class IO:
def read(self, filename):
toRead = open(filename, "rb")
out = toRead.read()
toRead.close()
return out
def write(self, filename, data):
toWrite = open(filename, "wb")
out = toWrite.write(data)
toWrite.close()
def append(self, filename, data):
append = self.read(filename)
self.write(filename, append+data)
f.write(text)이후에 있어야f.truncate()합니까?