..

Search

24) 파일 입출력

파일 입출력


파일 입출력

파이썬에서는 표준 입출력 함수인 input()과 print() 함수를 사용하여 프로그램과 사용자 사이의 입출력 작업을 수행할 수 있습니다.

그리고 프로그램과 파일 사이의 입출력 즉, 파일에 저장된 내용을 읽고 쓰는 동작은 파일 객체(file object)를 사용하여 수행할 수 있습니다.


파일 열고 닫기

파일의 내용을 읽고 쓰기 위해서는 우선 파일을 열어야만 합니다.

파이썬에서는 내장 함수인 open() 함수를 사용하여 파일을 열 수 있습니다.

문법

파일객체 = open(파일명, 파일모드문자열)

 

open() 함수의 첫 번째 인수에는 열고자 하는 파일의 이름과 경로를 문자열 형태로 전달하며, 두 번째 인수에는 파일의 사용 용도를 결정하는 파일 모드 문자열을 전달합니다.

이렇게 호출된 open() 함수는 해당 파일을 가리키는 파일 객체(file object)를 반환하며, 이 파일 객체를 가지고 다양한 파일 입출력 작업을 수행할 수 있습니다.

 

파일 입출력 작업이 모두 끝나면 파일 객체의 close() 함수를 사용하여 해당 파일 객체를 닫아줘야 합니다.

예제

fp = open('test.txt', 'w')

...

fp.close()

 

위의 예제는 "test.txt"라는 파일을 쓰기 전용으로 열고, 이에 해당하는 파일 객체를 변수 fp에 저장하고 있습니다.

이렇게 저장된 파일 객체를 가지고 원하는 작업을 모두 수행한 다음에는 close() 함수를 통해 파일 객체를 닫아주고 있습니다.

 

실행 중인 파이썬 프로그램이 종료되면, 해당 프로그램을 통해 열린 모든 파일 객체는 자동으로 닫힙니다.

하지만 close() 함수를 사용하여 명시적으로 파일 객체를 닫아주는 것이 예상치 못한 오류를 방지할 수 있습니다.

 

파일 입출력에 관한 예제는 보안상 온라인 코딩 연습에서는 연습해 볼 수 없으므로, 각자 자신의 컴퓨터에 설치된 파이썬 인터프리터를 활용하여 연습해 보도록 합시다.

파일 모드 문자열

open() 함수의 두 번째 인수로 전달되는 파일 모드 문자열은 해당 파일의 사용 용도를 결정하고 파일의 데이터를 어떤 방식으로 입출력할지를 결정하는 역할을 합니다.

 

파일 모드 문자열에는 가장 먼저 파일의 사용 용도를 결정하는 문자열이 나오며, 이를 생략할 경우 파일은 읽기 전용 모드(read mode)로 열립니다.

 

1. r (read mode) : 읽기 전용 모드 (기본값)

2. w (write mode) : 쓰기 전용 모드

3. a (append mode) : 파일의 마지막에 새로운 데이터를 추가하는 모드

 

그 다음으로 파일의 데이터를 어떤 방식으로 입출력할지를 결정하는 문자열이 이어지며, 이를 생략하면 파일은 텍스트 모드(text mode)로 열립니다.

 

1. t (text mode) : 해당 파일의 데이터를 텍스트 파일로 인식하고 입출력함. (기본값)

2. b (binary mode) : 해당 파일의 데이터를 바이너리 파일로 인식하고 입출력함.

 

마지막으로 다음과 같은 파일 모드 문자열을 추가할 수 있습니다.

 

1. x (exclusive mode) : 열고자 하는 파일이 이미 존재하면 파일 개방에 실패함.

2. + (update mode) : 파일을 읽을 수도 있고 쓸 수도 있도록 개방함.

 

예를 들어, 쓰기 전용 모드인 ‘w’로 파일을 열었을 경우 같은 이름의 파일이 이미 존재하면, 해당 파일에 저장되어 있던 모든 내용이 제거되고 파일이 열립니다. 하지만 같은 이름의 파일이 존재하지 않는다면, 해당 이름의 새로운 파일이 만들어져서 열리게 되는 것입니다.

 

파일 모드 문자열 중 파일 사용 용도의 기본값은 'r'(읽기 전용 모드)이며, 파일 양식의 기본값은 't'(텍스트 모드)입니다.

따라서 다음 보기의 파일 모드 문자열은 모두 같은 의미인 텍스트 파일의 읽기 전용 모드를 나타냅니다.

보기

'r', 't', 'rt'


파일 내용 읽기

open() 함수로 파일을 연 다음에는 해당 파일의 내용을 읽을 수 있습니다.

이를 위해 파이썬에서는 다음과 같은 함수들을 제공하고 있습니다.

 

1. read() 함수

2. readline() 함수

3. readlines() 함수

 

예제에 사용될 ‘test.txt’ 파일에는 다음과 같은 내용이 저장되어 있습니다.

text.txt

1번째 라인입니다.
2번째 라인입니다.
3번째 라인입니다.
마지막 라인입니다.

 

read() 함수는 해당 파일의 모든 내용을 읽어 들여 하나의 문자열로 반환합니다.

예제

fp = open('test.txt', 'r')  

 

file_data = fp.read()

print(file_data)  

 

fp.close()

실행결과

1번째 라인입니다.
2번째 라인입니다.
3번째 라인입니다.
마지막 라인입니다.

 

readline() 함수는 해당 파일의 내용을 한 라인씩 읽어 들여 문자열로 반환하며, 파일의 끝(EOF)에 도달하여 더 이상 가져올 라인이 없을 경우에는 None을 반환합니다.

예제

fp = open('test.txt', 'r')  

 

file_data = fp.readline()

print(file_data)  

 

fp.close()

실행결과

1번째 라인입니다.

 

readline() 함수는 한 번에 한 라인만을 읽을 수 있기 때문에 파일의 모든 내용을 읽기 위해서는 다음과 같이 반복문을 사용해야 합니다.

예제

fp = open('test.txt', 'r')  

 

while True:

    file_line = fp.readline()

    if not file_line:

        break

    print(file_line, end='')  

 

fp.close()

실행결과

1번째 라인입니다.
2번째 라인입니다.
3번째 라인입니다.
마지막 라인입니다.

 

마지막으로 readlines() 함수는 해당 파일의 모든 라인을 순서대로 읽어 들여 각각의 라인을 하나의 요소로 저장하는 하나의 리스트를 반환합니다.

예제

fp = open('test.txt', 'r')  

 

file_lines = fp.readlines()

print(file_lines)  

 

fp.close()

실행결과

['1번째 라인입니다.\n', '2번째 라인입니다.\n', '3번째 라인입니다.\n', '마지막 라인입니다.']

 

위의 실행결과처럼 readlines() 함수를 사용하여 파일의 내용을 읽어들일 때에는 개행 문자(‘\n’)까지 모두 함께 저장되는 것에 주의를 기울여야 합니다.


파일에 내용 추가하기

쓰기 전용 모드인 'w'는 만약 같은 이름의 파일이 이미 존재하면, 해당 파일에 저장되어 있는 모든 내용을 제거한 후 파일을 열게 됩니다.

따라서 기존에 존재하는 파일에 새로운 내용을 추가하려면 파일 모드 문자열을 ‘w’가 아닌 ‘a’로 전달해서 파일을 열어야만 합니다.

 

write() 함수를 사용하면 파일에 새로운 내용을 추가할 수 있습니다.

예제

fp = open('test.txt', 'a')

fp.write("\n추가된 라인입니다.")

fp.close()

실행결과

1번째 라인입니다.
2번째 라인입니다.
3번째 라인입니다.
마지막 라인입니다.

추가된 라인입니다.


자동으로 파일 닫기

지금까지 우리는 open() 함수를 사용하여 파일을 열고, 모든 작업이 끝난 뒤에는 close() 함수를 사용하여 파일을 닫아주었습니다.

하지만 실제 프로그래밍을 하다보면 특정 작업을 위해 연 파일을 닫는 작업을 자주 잊어버리는 실수를 하게 됩니다.

이와 같은 불편함을 해소하기 위해 파이썬에서는 개방한 파일을 자동으로 닫아주는 with 문이라는 편리한 구문을 제공하고 있습니다.

 

with 문은 해당 with 블록을 벗어남과 동시에 개방되었던 파일 객체를 자동으로 닫아줌으로써, 사용자가 열고 작업한 파일을 일일이 닫는 수고를 덜어주고 코드의 가독성까지 향상시켜 줍니다.

문법

with open(파일명, 파일모드문자열) as 파일객체:
    수행할 명령문

 

예제

fp = open('test.txt', 'r')  

 

file_data = fp.read()

print(file_data)  

 

fp.close()

 

위의 예제를 with 문을 사용하여 작성하면 다음과 같습니다.

예제

with open('test.txt', 'r') as fp:

    file_data = fp.read()

    print(file_data)

 

위와 같이 with 문을 사용하면 close() 함수를 사용하지 않아도 열어놓은 파일을 자동으로 닫아주며, 소스 코드의 가독성도 확연히 좋아짐을 확인할 수 있습니다.


연습문제