Bagaimana cara mencari dan mengganti teks dalam file menggunakan Python 3?
Ini kode saya:
import os
import sys
import fileinput
print ("Text to search for:")
textToSearch = input( "> " )
print ("Text to replace it with:")
textToReplace = input( "> " )
print ("File to perform Search-Replace on:")
fileToSearch = input( "> " )
#fileToSearch = 'D:\dummy1.txt'
tempFile = open( fileToSearch, 'r+' )
for line in fileinput.input( fileToSearch ):
if textToSearch in line :
print('Match Found')
else:
print('Match Not Found!!')
tempFile.write( line.replace( textToSearch, textToReplace ) )
tempFile.close()
input( '\n\n Press Enter to exit...' )
File input:
hi this is abcd hi this is abcd
This is dummy text file.
This is how search and replace works abcd
Ketika saya mencari dan mengganti 'ram' dengan 'abcd' di file input di atas, itu berfungsi sebagai pesona. Tetapi ketika saya melakukannya sebaliknya yaitu mengganti 'abcd' dengan 'ram', beberapa karakter sampah yang tersisa di akhir.
Mengganti 'abcd' dengan 'ram'
hi this is ram hi this is ram
This is dummy text file.
This is how search and replace works rambcd
Jawaban:
fileinput
sudah mendukung pengeditan inplace. Ini mengalihkanstdout
ke file dalam hal ini:sumber
end=''
seharusnya dilakukan argumen?line
sudah memiliki baris baru.end
adalah baris baru secara default,end=''
membuatprint()
fungsi tidak mencetak baris baru tambahanfileinput
bukan alat untuk semua pekerjaan ( tidak ada yang) tetapi ada banyak kasus di mana itu adalah alat yang tepat misalnya, untuk menerapkansed
filter-like di Python. Jangan gunakan obeng untuk menumbuk paku.fileinput
melakukannya (pada dasarnya, gunakantry..finally
atau manajer konteks untuk memastikan Anda mengatur stdout kembali ke nilai aslinya setelahnya). Kode sumbernyafileinput
cukup mengerikan, dan melakukan beberapa hal yang benar-benar tidak aman di bawah tenda. Jika ditulis hari ini saya sangat meragukan itu akan membuatnya menjadi stdlib.Seperti yang ditunjukkan oleh michaelb958, Anda tidak dapat mengganti di tempat dengan data dengan panjang yang berbeda karena ini akan membuat bagian-bagian lainnya tidak pada tempatnya. Saya tidak setuju dengan poster lain yang menyarankan Anda membaca dari satu file dan menulis ke yang lain. Sebagai gantinya, saya akan membaca file ke dalam memori, memperbaiki data, dan kemudian menuliskannya ke file yang sama dalam langkah terpisah.
Kecuali jika Anda memiliki file besar untuk bekerja dengan yang terlalu besar untuk dimuat ke memori dalam sekali jalan, atau Anda khawatir tentang kehilangan data potensial jika proses terganggu selama langkah kedua di mana Anda menulis data ke file.
sumber
with file = open(..):
tidak valid Python (=
) meskipun maksudnya jelas..replace()
tidak mengubah string (tidak dapat diubah) sehingga Anda perlu menggunakan nilai yang dikembalikan. Pokoknya kode yang mendukung file besar bisa lebih sederhana kecuali jika Anda perlu mencari dan mengganti teks yang membentang beberapa baris.with
pernyataan secara otomatis menutup file pada akhir blok pernyataan.Seperti yang diposting Jack Aidley dan JF Sebastian tunjukkan, kode ini tidak akan berfungsi:
Tetapi kode ini AKAN bekerja (saya sudah mengujinya):
Dengan menggunakan metode ini, filein dan fileout bisa menjadi file yang sama, karena Python 3.3 akan menimpa file saat dibuka untuk menulis.
sumber
with
pernyataan? 2. Seperti yang dinyatakan dalam jawaban saya,fileinput
dapat bekerja di tempat - dapat menggantikan data dalam file yang sama (menggunakan file sementara secara internal). Perbedaannya adalah bahwafileinput
tidak perlu memuat seluruh file ke dalam memori.with
blok yang lebih rapi ).Anda bisa melakukan penggantian seperti ini
sumber
Anda juga bisa menggunakan
pathlib
.sumber
Dengan satu dengan blok, Anda dapat mencari dan mengganti teks Anda:
sumber
seek
bagian awal file sebelum menulisnya.truncate
tidak melakukan itu dan Anda akan memiliki sampah di file.Masalah Anda berasal dari membaca dari dan menulis ke file yang sama. Daripada membuka
fileToSearch
untuk menulis, buka file sementara yang sebenarnya dan kemudian setelah Anda selesai dan telah ditutuptempFile
, gunakanos.rename
untuk memindahkan file barufileToSearch
.sumber
(pip instal python-util)
Parameter kedua (hal yang akan diganti, mis. "Abcd" juga bisa menjadi regex)
Akan mengganti semua kejadian
sumber
Varian saya, satu kata setiap kali pada seluruh file.
Saya membacanya ke dalam memori.
sumber
Saya telah melakukan ini:
sumber
fileinput
tidak bekerjainplace=True
denganutf-8
.Saya sedikit memodifikasi posting Jayram Singh untuk mengganti setiap instance dari '!' karakter ke nomor yang ingin saya tambahkan dengan setiap contoh. Berpikir itu mungkin bermanfaat bagi seseorang yang ingin memodifikasi karakter yang terjadi lebih dari sekali per baris dan ingin mengulanginya. Semoga itu bisa membantu seseorang. PS- Saya sangat baru dalam pengkodean sehingga permintaan maaf jika posting saya tidak pantas dengan cara apa pun, tetapi ini berhasil bagi saya.
sumber
sumber
Seperti itu:
sumber
sumber