답변:
경쟁 조건을 피하기 위해 파일을 닫았다가 다시 열지 않으려면 다음과 같이 할 수 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()
합니까?