Saat ini saya menggunakan ini:
f = open(filename, 'r+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.close()
Tetapi masalahnya adalah file lama lebih besar dari file baru. Jadi saya berakhir dengan file baru yang memiliki bagian dari file lama di ujungnya.
f.write(text)
setelahnyaf.truncate()
?f.write(text)
sebelumnya adaf.truncate()
di kode ini; itu menulis yangtext
pertama, jadi setelah.write()
kursor file diposisikan di akhirtext
. Melanjutkan untuk memotong file akan menghapus byte tersisa apa pun yang mungkin dimiliki file setelah titik ini. Dalam hal ini, hasil akhirnya akan sama seperti jika Anda dipotong sebelum menulis.fileinput
modul dapat menjadi metode yang disukai. Ketika diteruskaninplace=1
, itu akan memindahkan file ke lokasi sementara terlebih dahulu, lalu menulis file baru ke jalur nama file lama. Operasi pemindahan ini cepat pada filesystem unix, karena hanya memindahkan filesysteminode
, bukan konten lengkapnya. Kemudian Anda dapat membaca & memproses setiap baris satu per satu untuk menghindari pembengkakan memori. :-)Mungkin akan lebih mudah dan lebih rapi untuk menutup file setelahnya
text = re.sub('foobar', 'bar', text)
, membukanya kembali untuk ditulis (dengan demikian menghapus konten lama), dan menulis teks yang telah diperbarui ke sana.sumber
The
fileinput
modul memilikiinline
modus untuk menulis perubahan ke file Anda sedang memproses tanpa menggunakan file-file sementara dll Modul ini baik merangkum operasi umum dari perulangan atas baris dalam daftar file, melalui sebuah benda yang transparan melacak nama file, nomor baris dll jika Anda ingin memeriksanya di dalam loop.sumber
Sejujurnya Anda dapat melihat kelas yang saya bangun ini yang melakukan operasi file dasar. Metode tulis menimpa dan menambahkan menyimpan data lama.
sumber
Coba tulis di file baru ..
sumber