2012-07-13 34 views
9

Tôi có đoạn mã sau:Python thay thế và ghi đè lên thay vì phụ

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() 

nơi tôi muốn thay thế nội dung cũ đó là trong các tập tin với nội dung mới. Tuy nhiên, khi tôi thực thi mã của mình, tệp "test.xml" được thêm vào, tức là tôi có nội dung cũ được theo dõi bởi nội dung "được thay thế" mới. Tôi có thể làm gì để xóa nội dung cũ và chỉ giữ nội dung mới?

+1

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

Trả lời

20

Bạn cần phải sử dụng cắt ngắn nếu bạn muốn làm ở vị trí thay thế: http://docs.python.org/library/stdtypes.html?highlight=truncate#file.truncate

Hoặc bạn sử dụng open(myfile, 'w'). Thao tác này sẽ xóa tệp cũ để tạo tệp mới.

Cắt ngắn AFAIK không thay đổi inode, nhưng mở (..., 'w') sẽ tạo một inode mới. Nhưng trong hầu hết các trường hợp, điều này không quan trọng. ... Tôi đã thử nghiệm nó ngay bây giờ. Cả hai mở (..., 'w') và truncate() không thay đổi số inode của tập tin. (Thử nghiệm với Ubuntu 12.04 NFS và ext4).

Nhân tiện, điều này không thực sự liên quan đến Python. Trình thông dịch gọi API cấp thấp tương ứng. Phương pháp truncate() hoạt động tương tự trong ngôn ngữ lập trình C: Xem http://man7.org/linux/man-pages/man2/truncate.2.html

+0

Tuyệt vời, truncate đã hoạt động. Cảm ơn bạn! – Kaly

0

Sử dụng truncate(), giải pháp có thể là

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() 
Các vấn đề liên quan