본문 바로가기
프로그래밍/Python

파이썬(Python) 텍스트 파일 쉽게 수정하기 (feat. fileinput)

by 부자 꽁냥이 2023. 4. 19.

파이썬(Python) 내장 모듈인 fileinput을 이용하면 텍스트 파일을 쉽게 수정할 수 있다. 이번 포스팅에서는 fileinput 모듈을 이용하여 텍스트 파일을 수정하는 방법을 알아보자.


   fileinput을 이용한 텍스트 파일 수정

먼저 아래 그림과 같은 텍스트 파일(test_01.txt)을 만들어 주었다.

 

이제 fileinput을 이용하여 텍스트 내용을 수정해 보자.


1) 인코딩 확인

먼저 chardet을 이용하여 텍스트 파일의 인코딩 형식을 추출한다. 왜냐하면 fileinput을 이용할 때 인코딩 에러가 나는 경우 잘못하면 텍스트 전체가 날아갈 수 있기 때문이다. 

 

아래 코드는 텍스트 파일의 20줄까지 읽어서 인코딩 형식을 추측한다.

 

import chardet

text_file_path = './test_01.txt'

with open(text_file_path, 'rb') as f:
    raw_data = b''.join([f.readline() for _ in range(20)])
    encoding=chardet.detect(raw_data)['encoding']
    
print(encoding)

 

코드를 실행하면 아래와 같이 한국어 전용 인코딩인 EUC-KR인 것을 알 수 있다.

EUC-KR

2) 첫 번째 줄 수정하기 : isfirstline

fileinput의 input을 이용하여 텍스트 파일을 불러온 뒤 inplace 인자를 True로 설정하는 것이 fileinput으로 텍스트 파일을 수정하는 작업의 핵심이다.

 

이때 isfirstline을 이용하면 텍스트 파일의 첫 번째 줄을 수정할 수 있다. 수정은 print문을 이용한다. inplace=True로 되었다면 print는 출력이 아닌 텍스트 파일에 쓰는 작업을 수행한다. 

 

아래 코드는 텍스트 파일 경로와 인코딩 형식을 지정하여 텍스트 파일을 열고 첫 번째 줄을 수정한다. 이때 인코딩 형식 인자 encoding은 파이썬 3.10 이후에 생긴 것이니 참고하자.

 

import fileinput

## 첫번째 줄 수정하기    
with fileinput.input(text_file_path, inplace=True, encoding=encoding) as f: ## encoding은 3.10부터 추가
    for line in f:
        if f.isfirstline():
            print('반갑습니다.', end='\n')
        else:
            print(line, end='')

 

코드를 실행하고 텍스트 파일을 열면 위 그림과 같이 첫 번째 줄이 바뀐 것을 알 수 있다.


3) 특정 단어로 시작하는 줄 내용 바꾸기 : startswith

라인을 한줄한줄 읽으면서 startswith로 특정 단어로 시작하는지에 대해서 알 수 있다. 이를 이용하면 특정 단어로 시작하는 줄의 내용을 바꿀 수 있다.

 

아래 코드는 '감사'라는 단어로 시작하는 줄의 내용 '사랑합니다.'로 수정한다.

 

with fileinput.input(text_file_path, inplace=True, encoding=encoding) as f: ## encoding은 3.10부터 추가
    for line in f:
        if line.startswith('감사'):
            print('사랑합니다.', end='\n')
        else:
            print(line, end='')

 


4) 특정 단어 모두 바꾸기 : replace

이번엔 replace를 이용하여 텍스트 파일 속 특정 단어를 바꿔보자.

 

with fileinput.input(text_file_path, inplace=True, encoding=encoding) as f: ## encoding은 3.10부터 추가
    for line in f:
        if '니다' in line:
            print(line.replace('니다', '니당'), end='')
        else:
            print(line, end='')

 


댓글


맨 위로