Замінити рядок у вмісті файлу


97

Як я можу відкрити файл Stud.txt, а потім замінити будь-які випадки "A" на "Orange"?


4
Будь ласка (як завжди) дотримуйтесь загальних рекомендацій щодо питань , вкажіть будь-які спеціальні обмеження, покажіть те, що ви пробували дотепер, і запитайте про те, що саме вас бентежить.

18
Будь ласка, також позначте своє домашнє завдання тегом [домашнє завдання].
S.Lott

Відповіді:


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" для текстового режиму - лише Python 3. Крім того, ви надаєте менеджер контексту для вашого файлу виводу, але не вдається закрити вхідний файл, що здається суперечливим.
Стівен Румбальський

1
@katrielalex: Немає проти, я просто не проголосував. Але давати відповіді на домашнє завдання - це не правильний спосіб це зробити
BlueRaja - Danny Pflughoeft

Е-е, я не помітив, що це позначено як "домашнє завдання". Я не буду видаляти свою відповідь, але буду бути обережнішим у майбутньому
Гарет Девідсон

21
"давати відповіді на завдання домашнього завдання" - надзвичайно дурний коментар. Якщо хтось хоче допомоги, то допоможіть їм. Не всі прагнуть зробити свій HW, деякі насправді хочуть чомусь навчитися ...
KingMak

5
Мені це було потрібно для домашнього завдання, і це мені надзвичайно допомогло
mikeybeck

78

Якщо ви хочете замінити рядки в одному файлі, вам, мабуть, доведеться прочитати його вміст у локальній змінній, закрити та знову відкрити для запису:

У цьому прикладі я використовую оператор with , який закриває файл після завершення withблокування - або зазвичай, коли остання команда закінчується, або за винятком.

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)

Варто згадати, що якби імена файлів були різними, ми могли б зробити це більш елегантно за допомогою одного withтвердження.


Це рішення краще, оскільки ви не перейменовуєте файл, на відміну від наведеної вище відповіді.

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
Короткий і стислий, найкраща відповідь IMO
Briford Wylie

11

Щось на зразок

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

<do stuff with the result>

OP згадує "будь-які випадки", це означає, навіть якщо це підрядок - що не буде працювати для вашого прикладу.
Дурду,

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)

6

Якщо ви перебуваєте на Linux і просто хочете , щоб замінити слово dogз catви можете зробити:

text.txt:

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

Команда Linux:

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

Вихід:

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

Оригінальне повідомлення: /ubuntu/20414/find-and-replace-text-within-a-file-using-commands


2

Використання 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'))

Якби вхідні та вихідні файли були різними, ви б використовували дві різні змінні для read_textі write_text.

Якщо ви хочете, щоб зміна була більш складною, ніж одинарна заміна, ви призначили результат read_textзмінної, обробили її та зберегли новий вміст в іншу змінну, а потім зберегли новий вміст за допомогою write_text.

Якщо ваш файл був великим, ви віддаєте перевагу підходу, який не читає весь файл у пам'яті, а скоріше обробляє його рядок за рядком, як це показує Гарет Девідсон в іншій відповіді ( https://stackoverflow.com/a/4128192/3981273 ) , що, звичайно, вимагає використання двох різних файлів для введення та виведення.


write_text у мене не працює. Він не оновлює файл
Anurag

0

найпростіший спосіб - це зробити за допомогою регулярних виразів, припускаючи, що ви хочете виконати ітерацію по кожному рядку у файлі (де буде зберігатися 'A'), який ви робите ...

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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.