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.