Ganti string dalam konten file

96

Bagaimana cara membuka file, Stud.txt, dan kemudian mengganti kemunculan "A" dengan "Oranye"?

Joey
sumber
4
Harap (seperti biasa) ikuti pedoman pertanyaan umum , nyatakan batasan khusus, tunjukkan apa yang telah Anda coba sejauh ini, dan tanyakan tentang apa yang secara spesifik membingungkan Anda.
18
Tolong, tandai juga pekerjaan rumah Anda dengan tag [pekerjaan rumah].
S. Lott

Jawaban:

181
with open("Stud.txt", "rt") as fin:
    with open("out.txt", "wt") as fout:
        for line in fin:
            fout.write(line.replace('A', 'Orange'))
Gareth Davidson
sumber
8
"t" untuk mode teks hanya untuk Python 3. Selain itu, Anda menyediakan pengelola konteks untuk file ouput Anda, tetapi gagal menutup file masukan Anda, yang tampaknya tidak konsisten.
Steven Rumbalski
1
@katrielalex: Tidak ada suara negatif, saya hanya tidak memberi suara positif. Tetapi memberikan jawaban untuk pekerjaan rumah bukanlah cara yang tepat untuk melakukan ini
BlueRaja - Danny Pflughoeft
Uh, tidak menyadari ini di tag dengan "PR". Saya tidak akan menghapus jawaban saya tetapi akan lebih berhati-hati di masa mendatang
Gareth Davidson
21
"memberikan jawaban untuk masalah pekerjaan rumah" adalah komentar yang sangat bodoh. Jika seseorang membutuhkan bantuan maka bantu mereka. Tidak semua orang ingin melakukan HW mereka, beberapa benar-benar ingin mempelajari sesuatu ...
KingMak
5
Saya memang membutuhkan ini untuk pekerjaan rumah dan itu sangat membantu saya
mikeybeck
78

Jika Anda ingin mengganti string dalam file yang sama, Anda mungkin harus membaca isinya menjadi variabel lokal, menutupnya, dan membukanya kembali untuk menulis:

Saya menggunakan pernyataan with dalam contoh ini, yang menutup file setelah withblok diakhiri - baik secara normal ketika perintah terakhir selesai dijalankan, atau dengan pengecualian.

def inplace_change(filename, old_string, new_string):
    # Safely read the input filename using 'with'
    with open(filename) as f:
        s = f.read()
        if old_string not in s:
            print('"{old_string}" not found in {filename}.'.format(**locals()))
            return

    # Safely write the changed content, if found in the file
    with open(filename, 'w') as f:
        print('Changing "{old_string}" to "{new_string}" in {filename}'.format(**locals()))
        s = s.replace(old_string, new_string)
        f.write(s)

Perlu disebutkan bahwa jika nama file berbeda, kami dapat melakukan ini dengan lebih elegan dengan satu withpernyataan.

Adam Matan
sumber
Solusi ini lebih baik karena Anda tidak mengganti nama file seperti pada jawaban di atas.
47
#!/usr/bin/python

with open(FileName) as f:
    newText=f.read().replace('A', 'Orange')

with open(FileName, "w") as f:
    f.write(newText)
Mark Kahn
sumber
1
Singkat dan singkat, jawaban terbaik IMO
Briford Wylie
11

Sesuatu seperti

file = open('Stud.txt')
contents = file.read()
replaced_contents = contents.replace('A', 'Orange')

<do stuff with the result>
TartanLlama
sumber
OP menyebut "kemunculan" ini berarti, meskipun itu adalah substring - yang tidak akan berfungsi untuk contoh Anda.
Durdu
7
with open('Stud.txt','r') as f:
    newlines = []
    for line in f.readlines():
        newlines.append(line.replace('A', 'Orange'))
with open('Stud.txt', 'w') as f:
    for line in newlines:
        f.write(line)
Falmarri
sumber
6

Jika Anda menggunakan linux dan hanya ingin mengganti kata dogdengan, catAnda dapat melakukan:

text.txt:

Hi, i am a dog and dog's are awesome, i love dogs! dog dog dogs!

Perintah Linux:

sed -i 's/dog/cat/g' test.txt

Keluaran:

Hi, i am a cat and cat's are awesome, i love cats! cat cat cats!

Posting Asli: /ubuntu/20414/find-and-replace-text-within-a-file-using-commands

pengguna1767754
sumber
2

Menggunakan pathlib ( https://docs.python.org/3/library/pathlib.html )

from pathlib import Path
file = Path('Stud.txt')
file.write_text(file.read_text().replace('A', 'Orange'))

Jika file input dan output berbeda, Anda akan menggunakan dua variabel berbeda untuk read_textdan write_text.

Jika Anda menginginkan perubahan yang lebih kompleks daripada penggantian tunggal, Anda akan menetapkan hasil dari read_textke variabel, memprosesnya dan menyimpan konten baru ke variabel lain, lalu menyimpan konten baru dengan write_text.

Jika file Anda besar, Anda lebih memilih pendekatan yang tidak membaca seluruh file di memori, tetapi memprosesnya baris demi baris seperti yang ditunjukkan oleh Gareth Davidson di jawaban lain ( https://stackoverflow.com/a/4128192/3981273 ) , yang tentu saja membutuhkan dua file berbeda untuk input dan output.

Jorge Moraleda
sumber
write_text tidak berfungsi untuk saya. Itu tidak memperbarui file
Anurag
0

cara termudah adalah melakukannya dengan ekspresi reguler, dengan asumsi Anda ingin mengulang setiap baris dalam file (di mana 'A' akan disimpan) Anda lakukan ...

import re

input = file('C:\full_path\Stud.txt), 'r')
#when you try and write to a file with write permissions, it clears the file and writes only #what you tell it to the file.  So we have to save the file first.

saved_input
for eachLine in input:
    saved_input.append(eachLine)

#now we change entries with 'A' to 'Orange'
for i in range(0, len(old):
    search = re.sub('A', 'Orange', saved_input[i])
    if search is not None:
        saved_input[i] = search
#now we open the file in write mode (clearing it) and writing saved_input back to it
input = file('C:\full_path\Stud.txt), 'w')
for each in saved_input:
    input.write(each)
austinbv.dll
sumber