본문 바로가기
프로그래밍/파이썬 공부하기

Python 공부하기 - 10 (텍스트 프로세싱)

by _OlZl 2025. 9. 7.

이제 얼마 안 남은 학인시 대비입니다. 당장 내일이 시험인데 잘 볼란지 모르겠네요.

이번에는 텍스트 파일을 다루는 텍스트 프로세싱에 대해 알아보겠습니다.


파일 객체

파일 객체open 함수에 의해 반환되는 객체를 말합니다. 이를 통해 파이썬에서 텍스트 파일을 읽고 쓸 수 있습니다.

 

open() 함수를 통해 파일 객체를 생성하고, close() 함수를 통해 파일 객체를 닫을 수 있습니다.

하나의 파일에는 하나의 파일 객체만 접근이 가능하며, 다른 객체가 이용중일 때는 접근이 불가능하거나 기능이 제한됩니다.

f = open('file_path', mode)
f.close()

작업을 종료한 후에는 꼭 close해야 파일을 안전하게 닫을 수 있습니다.

 

텍스트 파일 처리에는 다양한 모드들이 있습니다.

mode 인자 기능
'r' read. 경로의 파일을 호출해 읽음. 파일이 없으면 에러 발생
'w' write. 파일에 내용 적음. 파일이 없으면 생성하고 있으면 덮어씀. 중간부턴 작성 불가
'x' 파일이 없으면 w 모드, 있으면 에러 발생
'a' append. 파일에 내용 적음. 경로에 파일이 있으면 이어서 작성 가능
'b' binary. 데이터를 이진법 형태로 표현 및 처리
't' text. 기본값.
'+' 읽기 쓰기 모두 가능

 

이런 모드들을 조합해서 사용할 수도 있습니다.

mode 인자 기능
rt, r 텍스트 모드 & 읽기 전용. 파일이 없으면 에러 발생 
wt, w 텍스트 모드 & 쓰기 전용. 파일이 없으면 생성하고 있으면 덮어씀.
at, a 텍스트 모드 & 추가 전용. 파일이 있으면 이어서 작성 가능.
rt+, r+ 텍스트 모드 & 읽기 모드 & 쓰기 모드. 파일이 없으면 에러 발생.
wt+, w+ 텍스트 모드 & 읽기 모드 & 쓰기 모드. 파일이 없으면 새로 생성.

파일 쓰기

파일에 무언가를 쓸 때는 'w' 모드와 'a' 모드를 사용할 수 있습니다.

 

f.write(str) : 문자열 str을 파일에 작성

f.writelines(list) : list의 값을 파일에 작성 (순서대로 공백 없이)

 

줄바꿈 (Enter) : \n, 탭 (Tab) : \t 을 사용해 구현할 수 있습니다.

f = open('text1.txt', 'w')

f.write('abcd\n')
f.write('1234')

f.close()
abcd
1234

 

이처럼 파일을 생성한 뒤 성공적으로 문자열을 쓴 것을 알 수 있습니다.

f = open('text1.txt', 'w')

f.write('abcd\n')
f.write('1234')

f.close()

f = open('text1.txt', 'a')

f.write('\n_OlZl\n')
f.write('5678')

f.close()
abcd
1234
_OlZl
5678

 

'a' 모드를 활용하면 기존 내용에 덧붙일 수 있습니다.

 

writelines를 활용해 리스트의 요소들을 추가할 수 있습니다.

f = open('text1.txt', 'w')

text_list = ['Hello', 'Nice', 'to', 'meet', 'you.']
f.writelines(text_list)

f.close()
HelloNicetomeetyou.

 

공백을 넣고 싶으면 join 을 사용하면 됩니다.

f = open('text1.txt', 'w')

text_list = ['Hello', 'Nice', 'to', 'meet', 'you.']
f.writelines(' '.join(text_list))

f.close()
Hello Nice to meet you.

파일 읽기

파일을 읽을 때는 'r' 모드를 사용할 수 있습니다.

 

f.read() : 파일 내용 전체 읽기 (하나의 문자열로 반환)

f.readline() : \n을 기준으로 line 하나 읽기 (하나의 문자열로 반환, \n은 요소 맨 뒤에 포함)

f.readlines() : 파일 내용 전체 읽기 (\n을 기준으로 분리한 리스트 반환, \n은 요소 맨 뒤에 포함)

Hello Nice to meet you.
How are you today?
I'm fine thank you. And you?
Me too, thanks.

이런 텍스트 파일로 세 함수의 차이를 보겠습니다.

f = open('text1.txt', 'r')

print("=== read() ===")
f.seek(0)  # 파일 포인터 처음으로 이동
read_res = f.read()
print(repr(read_res))  # 줄바꿈까지 확인하려면 repr 사용

print("\n=== readline() ===")
f.seek(0)
readline_res = f.readline()
print(repr(readline_res))

print("\n=== readlines() ===")
f.seek(0)
readlines_res = f.readlines()
print(repr(readlines_res))

f.close()
=== read() ===
"Hello Nice to meet you.\nHow are you today?\nI'm fine thank you. And you?\nMe too, thanks."

=== readline() ===
'Hello Nice to meet you.\n'

=== readlines() ===
['Hello Nice to meet you.\n', 'How are you today?\n', "I'm fine thank you. And you?\n", 'Me too, thanks.']

 

먼저, f.seek()은 이따가 설명하겠지만 커서를 옮기는 작업입니다.

read를 한 번 하면 커서가 맨 뒤로 가기 때문에 계속 앞으로 옮겨져야 파일을 읽을 수가 있는거죠.

repr()은 문자열을 원시적으로 보여주는 역할을 합니다. \n 등의 개행문자까지 그대로 출력해주는 역할을 하죠.

 

for문을 통해서도 파일을 읽어올 수 있습니다.

for line in f :
  code

 

위와 같은 코드는 한 줄 한 줄 읽어오는 기능을 하기 때문에 readlines로 만든 리스트의 요소들을 뽑아내는 것과 역할이 같습니다.

다만 break를 통해 중간에 빠져나갈 수 있다는 단점이 있죠.

f = open('text1.txt', 'r')

for line in f :
  name = line.strip()
  print(name)

f.close()

이런 식으로 for문을 통해 텍스트 파일의 줄을 하나하나 받아오고 strip으로 양쪽의 개행 문자를 제거 후 출력하여 readlines와 같은 효과를 낼 수 있습니다.


커서 (Cursor)

앞에서 설명한 것처럼 파일의 커서를 다루는 함수들이 있습니다.

 

f.tell() : 현재 커서의 위치 반환

f.seek() : 입력한 숫자에 해당하는 위치커서 이동

 

이번에도 아까와 같은 텍스트 파일로 테스트 해보겠습니다.

f = open('text1.txt', 'r')

print(f'시작 위치 : {f.tell()}')

f.seek(10) # 10으로 이동
print(f'현재 위치 : {f.tell()}')
readline_res1 = f.readline()
print(repr(readline_res1))

f.seek(50) # 50으로 이동
print(f'현재 위치 : {f.tell()}')
readline_res2 = f.readline()
print(repr(readline_res2))

f.close()
시작 위치 : 0
현재 위치 : 10
' to meet you.\n'
현재 위치 : 50
'ine thank you. And you?\n'

 

이를 통해 read를 시작하는 커서의 위치는 0이고, 커서 10의 위치는 ' ', 50의 위치는 'i'인 것을 알 수 있습니다.


with 문

with 문은 파일을 open하고 행동이 끝나는 순간 자동으로 close 하는 구문입니다.

이를 통해 깔끔하게 파일을 다룰 수 있습니다.

file_path = 'text1.txt'
with open(file_path, 'r') as f :
  read_res = f.read()
  print(read_res)
Hello Nice to meet you.
How are you today?
I'm fine thank you. And you?
Me too, thanks.

 

위와 같은 형태로 파일을 불러올 수 있습니다.