ファイルの内容内の文字列を置き換えます


97

Stud.txtファイルを開いて、「A」の出現箇所を「オレンジ」に置き換えるにはどうすればよいですか?


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のみです。また、出力ファイルのコンテキストマネージャーを提供しても、入力ファイルを閉じることができず、一貫性がないように見えます。
Steven Rumbalski、2010年

1
@katrielalex:反対票はありません。私は反対票を投じませんでした。しかし、宿題に答えを出すことは、これを行う正しい方法で
BlueRaja-Danny Pflughoeft 2010年

これは「宿題」のタグが付いていることに気づきませんでした。回答は削除しませんが、今後はさらに注意を払います
Gareth Davidson

21
「宿題の答えを出す」というのは非常に愚かなコメントです。誰かが助けを求めているなら、彼らを助けてください。誰もが自分のハードウェアを実行することを望んでいるわけではなく、実際に何かを学びたい人もいます...
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)

ファイル名が異なる場合は、1つのwithステートメントでこれをよりエレガントに行うことができたことに言及する価値があります。


上記の回答とは異なり、ファイルの名前を変更しないため、このソリューションの方が適しています。


11

何かのようなもの

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

<do stuff with the result>

OPは「任意の発生」と言及しましたが、これは、それが部分文字列である場合でも意味します。これは、例では機能しません。
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の使用(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_textwrite_text

単一の置換よりも複雑な変更が必要な場合は、の結果をread_text変数に割り当て、それを処理して新しいコンテンツを別の変数に保存してから、で新しいコンテンツを保存しwrite_textます。

ファイルが大きい場合は、メモリ内のファイル全体を読み取るのではなく、別の回答でGareth Davidsonが示しているように1行ずつ処理するアプローチを好むでしょう(https://stackoverflow.com/a/4128192/3981273)もちろん、入力と出力に2つの異なるファイルを使用する必要があります。


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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.