Ganti string dalam konten file


96

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


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'))

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.


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)

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>

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)


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.


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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.