본문 바로가기
Python

[Python] 파이썬 파일 입출력(읽기/쓰기) 예제

by A6K 2022. 10. 22.

파이썬으로 파일에 있는 데이터를 읽거나 파일로 데이터를 써야하는 경우가 많다. 이번 포스트에서는 파이썬으로 파일을 열고, 데이터를 읽고 쓰는 방법에 대해 정리해보겠다.

파일열기 - open()

우선 파일에서 데이터를 읽거나 파일로 데이터를 쓰려면 파일을 열어야 한다. 파일을 연다는 것은 파일을 다룰 수 있는 준비를 한다는 의미다.

파이썬에서 파일을 열기 위해서는 open() 함수를 써야 한다. open() 함수는 파이썬의 기본 내장 함수다. open() 함수를 호출 할 때, 옵션에 따라 파일이 없으면 생성하고, 읽기 전용 혹은 쓰기용으로 파일을 열 수 있다.

open() 함수의 기본형은 다음과 같다.

def open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True):

여러가지 옵션들이 있다.

우선 첫 번째 인자는 열고자하는 파일의 경로다. 현재 작업 디렉토리를 기준으로 파일의 상대 경로를 입력하거나 절대 경로를 입력하면 된다.

두 번째 인자는 파일이 열리는 모드를 의미한다. 알파벳 문자에 따라 파일을 어떤 목적으로 여는지, 열면서 어떤 동작을 하는지 지정할 수 있다. 입력할 수 있는 파일의 모드는 다음과 같다.

옵션 설명
r 읽기 모드 (기본값)
w 쓰기 모드 (이미 내용이 있다면 덮어쓰여짐)
a append 쓰기 모드 (이미 내용이 있다면 뒤에 덧붙여짐)
x 파일이 없으면 파일을 생성하고 쓰기모드로 오픈 (파일이 있으면 에러발생)
b 바이너리 데이터를 읽기 위한 모드
t 텍스트 데이터를 읽기 위한 모드

옵션 알파벳은 조합해서 입력할 수 있다. 예를 들어 'rt'를 입력하면 텍스트를 읽기 위한 모드를 의미하고, 'wt'는 텍스트를 쓰기위한 모드를 의미한다.

open() 함수는 파일을 열고, 파일에 작업할 수 있는 스트림을 리턴한다.

파일닫기 - close()

파일을 열면 파일에 작업할 수 있는 스트림을 리턴한다. 이 스트림을 통해 파일 작업을 한 다음, 마지막에는 반드시 close() 함수를 호출해서 파일을 닫아줘야한다.

파일을 닫아줘야 파이썬 인터프리터가 그 파일에 대한 운영체제의 리소스를 정리하고, 버퍼에 들어있던 쓰기 데이터들이 디스크(OS)로 Flush 된다.

파일을 열고 데이터를 쓰고, 파일을 닫는 파이썬 코드는 다음과 같다.

f = open('/home/user/myFile.txt', 'w')

f.write('write data\n')
f.write('write data2')

f.close()

open() 함수로 파일을 쓰기 모드로 열어 스트림을 받아왔다. 그 이후  스트림의 write() 함수를 이용해서 데이터를 쓴 다음 close() 함수로 파일을 닫았다.

파일열기 - with open

파일을 열어 작업을 한 다음 close() 함수를 호출하는 작업은 번거롭다. 게다가 중간에 코드의 흐림이 밖으로 뛰어 버리는 경우, 예를 들어 함수에서 리턴하는 코드가 추가되면 close() 함수가 호출되지 않은 채 파일의 스트림이 남겨져버리는 경우가 흔히 생긴다.

파이썬은 이런 에러 상황을 만들지 않기 위해 with open 구문을 제공한다. with open 구문을 이용하면 지정된 스코프에서만 파일을 사용할 수 있는 대신 스코프를 벗어나면 파일을 자동으로 닫아준다.

위에서 봤던 코드는 다음과 같이 with open 구문으로 바꿀 수 있다.

with open('/home/user/myFile.txt', 'w') as f:
  f.write('write data\n')
  f.write('write data2')

with open으로 파일을 열고 그 다음에 인덴트가 있는 부분에서만 파일을 사용할 수 있다.

파일에 쓰기 - write(), writelines()

파일에 데이터를 쓰기 위해서는 open() 함수가 리턴한 파일 스트림의 write() 함수 혹은 writelines() 함수를 이용하면 된다.

write() 함수 

write() 함수는 인자로 파일에 쓸 문자열을 받는다.

f = open('/home/user/myFile.txt', 'w')

f.write('line1 : test data\n')
f.write('line2 : another test data\n')

f.close()

write() 함수는 파일에 입력으로 받은 문자열을 써준다. 다만 문자열이 마지막에 개행 문자를 넣어주지는 않는다. 따라서 개행문자는 write() 함수를 호출하는 쪽에서 추가해줘야 한다.

writelines() 함수

writelines() 함수는 인자로 파일에 출력할 문자열 리스트를 받는다.

f = open('/home/user/myFile.txt', 'a')

f.writelines(['line3', 'abcd', 'efg', 'hijk', '\n'])
f.writelines('\n'.join(['line4', 'line5', 'line6'])

f.close()

write() 함수와 마찬가지로 자동으로 개행 문자를 넣어주지는 않기 때문에 호출하는 쪽에서 문자열에 적당히 개행문자를 포함해줘야한다. 

문자열을 라인단위로 출력하기 위해서 개행문자(\n)를 이용해 문자열 리스트를 Join 한 다음 넘겨주면 편하다.

파일에서 읽기 - for 문

open()으로 파일을 열어 얻어진 파일 스트림은 반복문에서 사용해 파일의 내용을 한줄 씩 읽는데 사용할 수 있다.

with open('myFile.txt', 'r'):
  for line in f:
    print(line.strip())

이러면 파일에서 한줄 씩 읽어서 line 변수에 담아주고, 반복문의 Body에서 라인을 처리하면 된다. 참고로 읽은 line의 마지막에는 개행문자가 있는데 strip() 함수를 이용해서 깔끔하게 제거해주면 된다.

파일에서 읽기 - read(), readline(), readlines(), seek(), tell()

파일에서 데이터를 읽기 위해서는 read() 혹은 readlines(), readline() 함수를 호출해야하며, seek(), tell()  함수와 함께 구성해서 사용하면 된다.

read(n)

read() 함수는 파일로부터 n바이트의 문자를 읽어오는 함수다. 인자로 아무 숫자도 주지 않은 경우 파일에 있는 모든 문자를 읽어서 리턴한다.

with open("myFile.txt", "r") as f:
    example = f.read()

print(example)

readline()

readline() 함수는 파일의 현재 오프셋에서 한줄을 읽는다. 즉, 개행문자(\n)가 나타날 때까지 데이터를 읽어서 리턴해준다.

with open("myFile.txt", "r") as f:
    while True:
        line = f.readline()
        if not line: # EOF
            break
            
        print(line.strip())

반복해서 파일의 데이터를 한 줄씩 읽다가 읽은 라인이 없는 경우 반복문을 벗어나면 된다. readline() 함수는 더 이상 읽을 라인이 없는 경우 빈 문자열("")을 리턴한다. 참고로 아무것도 없는 빈 라인을 읽은 경우라도 개행문자 하나가 있기 때문에 반복문을 벗어나지는 않는다.

readlines()

readlines() 함수는 파일의 현재 오프셋에서 개행문자를 포함한 모든 문자열을 읽어온다. 읽어온 문자열들을 리스트 형태로 반환한다.

with open("myFile.txt", "r") as f:
    lines = f.readlines() # ['line1\n', 'line2\n', 'line3'] 저장
    for line in lines:
        print(line.strip())

seek(n)

파일 커서의 오프셋을 입력한 숫자로 조정한다.

tell()

현재 커서의 오프셋을 리턴한다.


 

파이썬 스크립트 작성에 도움되는 글 모음

파이썬으로 프로그램을 작성할 때 도움되는 글들을 모아본다. Python 문법 Python 모듈

hbase.tistory.com

 

댓글