2012-07-13 2 views
9

를 추가로 덮어 나는 다음과 같은 코드를 가지고 : 나는 새로운 내용으로 파일의 이전 내용을 교체하고 싶습니다파이썬이 대체하고 대신

import re 
#open the xml file for reading: 
file = open('path/test.xml','r+') 
#convert to string: 
data = file.read() 
file.write(re.sub(r"<string>ABC</string>(\s+)<string>(.*)</string>",r"<xyz>ABC</xyz>\1<xyz>\2</xyz>",data)) 
file.close() 

. 그러나 코드를 실행하면 "test.xml"파일이 추가됩니다. 즉, 새 "대체 된"컨텐츠에 이어 이전 컨텐츠가 있습니다. 이전 물건을 삭제하고 새 물건 만 보관하려면 어떻게해야합니까? http://docs.python.org/library/stdtypes.html?highlight=truncate#file.truncate

아니면 open(myfile, 'w')를 사용

+1

http://stackoverflow.com/questions/2424000/read-and-overwrite-a -file-in-python –

답변

20

당신은 당신이 장소에서하고 싶은 대체 할 경우자를 사용해야합니다. 이렇게하면 이전 파일이 삭제되어 새 파일이 만들어집니다.

AFAIK truncate는 inode를 변경하지 않지만 open (..., 'w')은 새로운 inode를 만듭니다. 그러나 대부분의 경우 이것은 중요하지 않습니다. ... 나는 지금 그것을 시험했다. open (..., 'w') 및 truncate()는 파일의 inode 번호를 변경하지 않습니다. (Ubuntu 12.04 NFS 및 ext4로 테스트되었습니다).

그런데 이것은 실제로 파이썬과 관련이 없습니다. 인터프리터는 해당 저수준 API를 호출합니다. C 프로그래밍 언어에서 동일하게 작동 truncate() 방법은 : 해결책이 될 수 truncate()를 사용 http://man7.org/linux/man-pages/man2/truncate.2.html

+0

위대한, 잘린 작품. 고맙습니다! – Kaly

0

를 참조

import re 
#open the xml file for reading: 
with open('path/test.xml','r+') as f: 
    #convert to string: 
    data = f.read() 
    f.seek(0) 
    f.write(re.sub(r"<string>ABC</string>(\s+)<string>(.*)</string>",r"<xyz>ABC</xyz>\1<xyz>\2</xyz>",data)) 
    f.truncate() 
    f.close() 
관련 문제