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


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.