파일 내용 내에서 문자열 바꾸기


96

Stud.txt 파일을 열고 "A"를 "Orange"로 바꾸려면 어떻게해야합니까?


4
(항상 그렇듯이) 일반적인 질문 가이드 라인을 따르고 , 특별한 제한 사항을 명시하고, 지금까지 시도한 내용을 보여주고, 특히 혼란스러운 점이 무엇인지 물어보세요.

18
또한 숙제를 [homework] 태그로 표시하십시오.
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 : 찬성표가없고 단순히 찬성표도 없었습니다. 그러나 숙제에 대한 답에서 제공하는 것은 이 옳은 방법이 아니다
대니 Pflughoeft - BlueRaja

어,이게 "숙제"태그가 붙은 걸 몰랐어요. 나는 내 대답을 삭제하지 않을 것이지만 앞으로 더 조심할 것입니다
Gareth Davidson

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 와일리

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_text하고 write_text.

단일 교체보다 더 복잡한 변경을 원하면 결과를 read_text변수에 할당하고 처리하고 새 내용을 다른 변수에 저장 한 다음 새 내용을 다음을 사용하여 저장합니다.write_text .

파일이 큰 경우 메모리에서 전체 파일을 읽지 않고 Gareth Davidson이 다른 답변 ( 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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.