먹고 기도하고 코딩하라

파이썬 텍스트 파일 입출력 메소드 본문

Python

파이썬 텍스트 파일 입출력 메소드

사과먹는사람 2021. 7. 16. 17:03
728x90
728x90

 

파일 입출력도 문자열, 리스트처럼 돌아서면 잊어버리기 쉬운 것들 중 하나다. 

이번 포스팅에서는 파이썬 텍스트 파일 입출력 메소드를 정리하고 메소드들 간 차이점을 알아본다.

 

 

1. 파일 입력

파일 입력을 받는 방법은 크게 3가지가 있다.

f.read()
f.readline()
f.readlines()

 

1-1. read() -> str (전문)

첫 번째, read()부터 살펴보자. read() 함수는 텍스트 파일의 모든 내용을 전부 문자열(str) 타입으로 가져온다. 개행 문자도 예외없이 가져온다. 즉, 텍스트 파일의 전문을 문자열 그대로 가져오고 싶다면 read를 쓰는 것이 좋다.

dummy.txt의 내용은 다음과 같다.

The Big Short
The Cathedral
Sherlock Holmes
Matilda
Le Petit Prince
# read 사용
l = []
with open('dummy.txt', 'r') as f:
  str1 = f.read()
  l.append(str1)
  print(str1)
  print(type(str1))
  print(l)
  

The Big Short
The Cathedral
Sherlock Holmes
Matilda
Le Petit Prince
<class 'str'>
['The Big Short\nThe Cathedral\nSherlock Holmes\nMatilda\nLe Petit Prince']

문자열(str) 하나에 모든 텍스트 내용을 다 합쳐서 내보내는 것이기 때문에 리스트에 append시키면 하나의 문자열이 들어간다.

 

1-2. readline() -> str(개행이 뒤에 붙은 한 줄)

두 번째, readline()을 살펴보자. readline()의 경우 텍스트 파일을 개행 문자 단위로 나눠 개행 문자를 포함한 첫 줄까지만 문자열(str)로 가져온다. 즉, readline()을 할 경우 가져오는 문자열이 그 텍스트 파일의 마지막 줄이 아닌 이상 \n이 결과에 포함되어 있는 것이다.

with open('dummy.txt', 'r') as f:
  str1 = f.readline()
  print(str1)
  print(type(str1))
  print(f.readline())
  

The Big Short

<class 'str'>
The Cathedral

이렇게 하면 한 줄 한 줄 일일이 읽어와야 하는데, readline을 이용해서 문자열 전체를 한 줄씩 읽어오는 방법이 있다. 바로 무한루프 while 안에서 f.readline()을 쓰고, 더 이상 읽어올 것이 없으면 루프문을 탈출하는 방법이다.

l = []
with open('dummy.txt', 'r') as f:
  while True:
    str1 = f.readline()
    if str1 == '': break
    l.append(str1)
    print(str1)

print(l)

The Big Short

The Cathedral

Sherlock Holmes

Matilda

Le Petit Prince
['The Big Short\n', 'The Cathedral\n', 'Sherlock Holmes\n', 'Matilda\n', 'Le Petit Prince']

리스트를 보다시피 하나의 원소 끝마다 \n이 껴 있는 모습이다. 만약 개행 문자를 원하지 않고 텍스트 그대로를 원할 경우에는 특별히 처리를 해야 함을 주지해야 한다.

그리고 눈치챘을 수도 있겠지만, readline()을 할 때마다 출력되는 줄이 바뀐다. 즉, 파일 객체 f가 어디까지 읽었는지 그 인덱스를 기억하고 있는 것이다. 그래서 f.read()나 f.readlines()로 텍스트 파일을 한 번에 다 읽어온 후 f.readline()을 하면 빈 문자열이 출력된다. f.readline()을 쓸 때는 이 점을 알아야 한다.

이 때 tell() 메소드를 쓰면 현재 파일에서 위치가 어디인지 알 수 있다. 이 메소드는 파일 시작부터 바이트 단위로 측정해 시작 지점부터 얼마나 떨어져있는지 정수값을 돌려준다. 

 

1-3. readlines() -> list (개행 문자가 뒤에 붙은 문자열들이 리스트 요소)

readlines()의 경우 readline의 결과를 하나하나 리스트에 추가한 것과 똑같은 결과를 낸다. 개행 문자를 단위로 split한 문자열들로 이뤄진 리스트를 반환하며, readlien()과 마찬가지로 요소가 맨 마지막 요소가 아닌 이상 각 요소의 맨 끝에는 개행 문자가 끼어 있다.

with open('dummy.txt', 'r') as f:
  str1 = f.readlines()
  print(str1)
  
['The Big Short\n', 'The Cathedral\n', 'Sherlock Holmes\n', 'Matilda\n', 'Le Petit Prince']

 

 

2. 파일 출력

파일 출력은 단순하다. txt 파일을 쓰기모드로 연 파일 객체.write(data)를 하면 입력이 된다.

f.write(data)

이 때 'w' 모드로 열었는데 텍스트 파일이 이미 존재한다면 해당 파일을 삭제하고 내용을 새로 쓴다.

txt 파일을 이어쓰기(a) 모드로 열면 텍스트 파일의 맨 마지막 부분을 찾아 그 부분부터 data를 입력하게 된다.

 

with open('dummy.txt', 'w') as f:
  f.write('hello')

with open('dummy.txt', 'w') as f:
  f.write('python')
  
# 결과 : python
with open('dummy.txt', 'w') as f:
  f.write('hello')

with open('dummy.txt', 'a') as f:
  f.write('python')

# 결과 : hellopython

 

728x90
반응형
Comments