Saya ingin mengulang isi file teks dan melakukan pencarian dan mengganti beberapa baris dan menulis hasilnya kembali ke file. Saya pertama-tama dapat memuat seluruh file dalam memori dan kemudian menulisnya kembali, tetapi itu mungkin bukan cara terbaik untuk melakukannya.
Apa cara terbaik untuk melakukan ini, dalam kode berikut?
f = open(file)
for line in f:
if line.contains('foo'):
newline = line.replace('foo', 'bar')
# how to write this newline back to the file
file
membayangi kelas yang telah ditentukan dengan nama yang sama.mkstemp()
mengembalikan 2-tupel dan(fh, abs_path) = fh, abs_path
, saya tidak tahu ketika saya mengajukan pertanyaan.Cara terpendek mungkin adalah dengan menggunakan modul fileinput . Misalnya, berikut ini menambahkan nomor baris ke file, di tempat:
Yang terjadi di sini adalah:
print
pernyataan menulis kembali ke file aslifileinput
memiliki lebih banyak bel dan peluit. Misalnya, ini dapat digunakan untuk beroperasi secara otomatis pada semua file disys.args[1:]
, tanpa Anda harus mengulanginya secara eksplisit. Dimulai dengan Python 3.2 itu juga menyediakan manajer konteks yang nyaman untuk digunakan dalamwith
pernyataan.Walaupun
fileinput
bagus untuk skrip yang dapat dibuang, saya akan berhati-hati menggunakannya dalam kode nyata karena memang itu tidak mudah dibaca atau tidak asing. Dalam kode (produksi) yang sebenarnya, sebaiknya hanya menghabiskan beberapa baris kode lagi untuk menjadikan prosesnya eksplisit dan dengan demikian membuat kode tersebut dapat dibaca.Ada dua opsi:
sumber
print(line, end='')
Berikut contoh lain yang telah diuji, dan akan cocok dengan pola pencarian & ganti:
Contoh penggunaan:
sumber
searchExp in line
jugaline.replace
operasi ekspresi reguler. Tentunya contoh penggunaannya salah.if searchExp in line: line = line.replace(searchExp, replaceExpr)
Anda bisa menulisline = line.replace(searchExp, replaceExpr)
. Tidak terkecuali yang dihasilkan, garis tetap tidak berubah.sys.stdout.write(line)
. Terima kasih lagi!Ini harus bekerja: (inplace editing)
sumber
files
harus berupa string yang berisi nama file, bukan objek file .Berdasarkan jawaban oleh Thomas Watnedal. Namun, ini tidak menjawab bagian line-to-line dari pertanyaan aslinya. Fungsi masih dapat menggantikan secara garis-ke-garis
Implementasi ini menggantikan konten file tanpa menggunakan file sementara, karena itu izin file tetap tidak berubah.
Juga ganti alih-alih ganti, izinkan penggantian regex alih-alih hanya penggantian teks biasa.
Membaca file sebagai string tunggal dan bukannya baris demi baris memungkinkan untuk pencocokan dan penggantian multiline.
sumber
rb
danwb
atribut ketika membuka file karena ini akan mempertahankan akhir baris asliSeperti yang disarankan lassevk, tuliskan file baru saat Anda mulai, berikut adalah beberapa contoh kode:
sumber
Jika Anda menginginkan fungsi generik yang menggantikan teks apa pun dengan teks lain, ini kemungkinan merupakan cara terbaik, terutama jika Anda seorang penggemar regex:
sumber
Cara yang lebih pythonic adalah dengan menggunakan manajer konteks seperti kode di bawah ini:
Anda dapat menemukan cuplikan lengkapnya di sini .
sumber
Buat file baru, salin baris dari yang lama ke yang baru, dan lakukan penggantian sebelum Anda menulis baris ke file baru.
sumber
Memperluas jawaban @ Kiran, yang saya setujui lebih ringkas dan Pythonic, ini menambahkan codec untuk mendukung pembacaan dan penulisan UTF-8:
sumber
Menggunakan jawaban hamishmcn sebagai templat, saya bisa mencari baris dalam file yang cocok dengan regex saya dan menggantinya dengan string kosong.
sumber
fileinput
cukup mudah seperti yang disebutkan pada jawaban sebelumnya:Penjelasan:
fileinput
dapat menerima beberapa file, tetapi saya lebih suka menutup setiap file segera setelah diproses. Jadi ditempatkan tunggalfile_path
dalamwith
pernyataan.print
pernyataan tidak mencetak apa pun ketikainplace=True
, karenaSTDOUT
sedang diteruskan ke file asli.end=''
dalamprint
pernyataan adalah untuk menghilangkan baris baru kosong menengah.Dapat digunakan sebagai berikut:
sumber
jika Anda menghapus indentasi pada seperti di bawah ini, itu akan mencari dan mengganti dalam beberapa baris. Lihat di bawah sebagai contoh.
sumber