Câu trả lời:
Nếu bạn không muốn đóng và mở lại tệp, để tránh các điều kiện về chủng tộc, bạn có thể truncate
:
f = open(filename, 'r+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.truncate()
f.close()
Chức năng này cũng có thể sẽ sạch hơn và an toàn hơnopen
khi sử dụng làm trình quản lý ngữ cảnh, chức năng này sẽ đóng trình xử lý tệp, ngay cả khi xảy ra lỗi!
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)
nằm trước f.truncate()
trong mã này; nó ghi text
đầu tiên, vì vậy sau khi .write()
con trỏ tệp được đặt ở cuối text
. Tiến hành cắt bớt tệp sẽ loại bỏ bất kỳ byte nào còn lại mà tệp có thể có sau thời điểm này. Trong trường hợp này, kết quả cuối cùng sẽ giống như khi bạn cắt ngắn trước khi viết.
fileinput
mô-đun có thể trở thành phương pháp được ưu tiên. Khi được thông qua inplace=1
, nó sẽ di chuyển tệp đến vị trí tạm thời trước tiên, sau đó ghi tệp mới vào đường dẫn tên tệp cũ. Thao tác di chuyển này diễn ra nhanh trên hệ thống tệp unix, vì nó chỉ di chuyển hệ thống tệp inode
chứ không phải toàn bộ nội dung. Sau đó, bạn có thể đọc và xử lý từng dòng riêng lẻ để tránh bộ nhớ bị phình ra. :-)
Các fileinput
mô-đun có inline
chế độ cho các văn bản thay đổi đối với tập tin bạn đang xử lý mà không sử dụng tập tin tạm thời, vv Các module độc đáo gói gọn các hoạt động chung của Looping trên các dòng trong một danh sách các tập tin, thông qua một đối tượng mà minh bạch theo dõi những tên tập tin, số dòng, v.v. nếu bạn muốn kiểm tra chúng bên trong vòng lặp.
import fileinput
for line in fileinput.FileInput("file",inplace=1):
if "foobar" in line:
line=line.replace("foobar","bar")
print line
Thành thật mà nói, bạn có thể xem lớp này mà tôi đã xây dựng, nó thực hiện các thao tác cơ bản với tệp. Phương thức ghi sẽ ghi đè và chắp thêm giữ dữ liệu cũ.
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)
sauf.truncate()
?