Dosya içeriği içindeki dizeyi değiştirin


100

Bir dosyayı (Stud.txt) nasıl açabilirim ve ardından "A" nın tekrarlarını "Orange" ile değiştirebilirim?


4
Lütfen (her zaman olduğu gibi) genel soru kurallarına uyun , varsa özel kısıtlamaları belirtin, şimdiye kadar denediklerinizi gösterin ve özellikle neyin kafanızı karıştırdığını sorun.

21
Lütfen ödevinizi [homework] etiketiyle işaretleyin.
S.Lott

Yanıtlar:


183
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
Metin modu için "t" yalnızca Python 3'tür. Ayrıca, çıktı dosyanız için bir bağlam yöneticisi sağlarsınız, ancak tutarsız görünen girdi dosyanızı kapatamazsınız.
Steven Rumbalski

1
@katrielalex: Olumsuz oy yok, basitçe oy vermedim. Ancak ödevlere cevap vermek bunu yapmanın doğru yolu değil
BlueRaja - Danny Pflughoeft

Bunun "ev ödevi" olarak etiketlendiğini fark etmedim. Cevabımı silmeyeceğim ama gelecekte daha dikkatli olacağım
Gareth Davidson

23
"ev ödevi problemlerine cevap vermek" son derece aptalca bir yorumdur. Biri yardım isterse, yardım edin. Herkes kendi
donanımını

6
Buna ev ödevi için ihtiyacım vardı ve bu bana çok yardımcı oldu
mikeybeck

81

Aynı dosyadaki dizeleri değiştirmek isterseniz, muhtemelen içeriğini yerel bir değişkene okumanız, kapatmanız ve yazmak için yeniden açmanız gerekir:

Bu örnekte, blok sonlandırıldıktan sonra dosyayı kapatan with ifadesini kullanıyorum with- normalde son komutun yürütülmesi bittiğinde veya bir istisna ile.

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)

Dosya adları farklı olsaydı, bunu tek bir withifadeyle daha zarif bir şekilde yapabilirdik .


1
Bu çözüm daha iyidir çünkü dosyayı yukarıdaki cevaptan farklı olarak yeniden adlandırmazsınız.

52
#!/usr/bin/python

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

with open(FileName, "w") as f:
    f.write(newText)

2
Kısa ve öz, en iyi cevap IMO
Briford Wylie

11

Gibi bir şey

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

<do stuff with the result>

OP, "herhangi bir oluşumdan" bahsetmiştir, bu, bir alt dize olsa bile, örneğiniz için işe yaramayacağı anlamına gelir.
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

Pathlib'i kullanma ( 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'))

Giriş ve çıkış dosyaları farklı olsaydı sizin için iki farklı değişkenler kullanır read_textve write_text.

Tek bir değiştirmeden daha karmaşık bir değişiklik istiyorsanız, sonucunu read_textbir değişkene atar, işler ve yeni içeriği başka bir değişkene kaydeder ve ardından yeni içeriği ile kaydedersiniz write_text.

Dosyanız büyükse, tüm dosyayı bellekte okumayan, bunun yerine Gareth Davidson tarafından başka bir yanıtta gösterildiği gibi satır satır işleyen bir yaklaşımı tercih edersiniz ( https://stackoverflow.com/a/4128192/3981273 ) , tabii ki giriş ve çıkış için iki farklı dosya kullanmayı gerektirir.


write_text benim için çalışmıyor. Dosyayı güncellemiyor
Anurag

0

en kolay yol, bunu dosyadaki her satırı yinelemek istediğiniz varsayılarak (burada 'A' nın saklanacağı) normal ifadelerle yapmaktır.

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.