Python에서 파일 읽기 및 덮어 쓰기


108

현재 나는 이것을 사용하고 있습니다 :

f = open(filename, 'r+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.close()

그러나 문제는 이전 파일이 새 파일보다 크다는 것입니다. 그래서 나는 그 끝에 이전 파일의 일부가있는 새 파일로 끝납니다.

답변:


178

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

2
이 코드에서는 @volvox f.write(text)가 앞에 f.truncate()있습니다. text첫 번째를 작성 하므로 .write()파일 커서가 text. 파일 자르기를 진행하면이 시점 이후에 파일에 남아있을 수있는 모든 바이트가 제거됩니다. 이 경우 최종 결과는 쓰기 전에 잘린 것과 동일합니다.
nosklo

매우 큰 파일의 경우 전체 파일 내용을 메모리로 읽는 것이 어려울 수 있습니다. 따라서 fileinput모듈 이 선호되는 방법이 될 수 있습니다. 전달되면 inplace=1먼저 파일을 임시 위치로 이동 한 다음 이전 파일 이름 경로에 새 파일을 씁니다. 이 이동 작업은 inode전체 내용이 아닌 파일 시스템을 이동하기 때문에 유닉스 파일 시스템에서 빠릅니다 . 그런 다음 메모리 팽창을 방지하기 위해 각 줄을 개별적으로 읽고 처리 할 수 ​​있습니다. :-)
TrinitronX

16

아마도. 후에 파일을 닫고 text = re.sub('foobar', 'bar', text)쓰기 위해 다시 열고 (따라서 이전 내용을 지우고) 업데이트 된 텍스트를 작성 하는 것이 더 쉽고 깔끔 할 것입니다.


16

fileinput모듈은이 inline투명하게 파일 이름을 추적 오브젝트를 통해, 모듈 멋지게 파일 목록의 라인을 통해 루프의 공동 작업을 캡슐화 임시 파일을 사용하는 등없이 당신이 처리하는 파일에 대한 변경 사항을 작성하기위한 모드 루프 내에서 검사해야하는 경우 줄 번호 등.

import fileinput
for line in fileinput.FileInput("file",inplace=1):
    if "foobar" in line:
         line=line.replace("foobar","bar")
    print line

0

솔직히 기본 파일 작업을 수행하는이 클래스를 살펴볼 수 있습니다. 쓰기 방법은 이전 데이터를 덮어 쓰고 추가합니다.

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)
        

-2

새 파일로 작성해보십시오 ..

f = open(filename, 'r+')
f2= open(filename2,'a+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.close()
f2.write(text)
fw.close()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.