Python 기초

텍스트 파일 읽고 쓰기

파일 열기와 닫기

어떻게 파일에 저장된 데이터를 읽을 수 있을까요? 파일을 사용하려면 먼저 파일을 열어야 합니다. 파일을 여는 함수는 open() 입니다.

open()은 파일 이름을 받아서 파일 객체를 생성한 후에 이것을 반환합니다. 파일이 열리면 우리는 파일에서 데이터를 읽거나 쓸 수 있습니다.

파일과 관련된 직업이 모두 종료되면 파일을 닫아야 합니다. 파일 객체가 가지고 있는 close()를 호출하면 파일이 닫혀집니다.

infile = open("input.txt", "r)
...
infile.close()

 

open()의 첫 번째 매개 변수는 파일의 이름입니다. open()은 이름이 "input.txt"인 파일을 열고, 파일과 연관된 객체를 생성한 후에, 이 객체를 반환합니다.

파일에서 데이터를 읽거나 쓰려면 반드시 이 파일 객체가 필요합니다. 만약 open()이 파일을 여는 데 실패하면 None 객체가 반환됩니다.

 

open()의 두 번째 매개 변수는 파일을 여는 모드를 의미합니다. 파일 모드는 파일과 관련된 여러 가지 선택 사항을 결정하는 문자열입니다.

예를 들어서 파일 모드가 "r"이면 읽기 작업을 위하여 파일을 여는 것입니다.

 

파일 모드

기본적인 파일 모드로 "r", "w", "a" 가 있습니다. 그 의미는 다음 표와 같습니다.

파일 모드 모드 이름 설명
"r" 읽기 모드(read mode) 파일의 처음부터 읽습니다.
"w" 쓰기 모드(write mode) 파일의 처음부터 씁니다. 파일이 없으면 생성됩니다. 만약 파일이 존재하면 기존의 내용은 지워집니다.
"a" 추가 모드(append mode) 파일의 끝에 씁니다. 파일이 없으면 생성됩니다.
"r+" 읽기와 쓰기 모드 파일에 읽고 쓸 수 있는 모드입니다. 모드를 변경하려면 seek()가 호출되어야 합니다.

 

파일 열기 예

현재 디렉토리에 있는 "phones.txt" 라는 파일을 읽기 모드로 열려면 아래와 같은 문장을 사용합니다.

infile = open("phones.txt", "r")

 

윈도우에서 다음과 같은 절대 경로를 사용해도 됩니다. 예를 들어서 C 드라이브의 \tmp 디렉토리의 "phones.txt" 파일을 여는 문장은 아래와 같습니다.

infile = open(r"c:\tmp\phones.txt", "r")

 

파일 이름 앞에 붙이는 r 접두어는 문자열을 원천 문자열(raw string)로 취급하라는 것을 의미합니다.

즉 "\"를 특별한 의미(이스케이프 시퀀스)로 해석하지 말라는 것을 의미합니다. 다음과 같이 적어 주어도 됩니다.

infile = open("c:\\tmp\\phones.txt", "r")

 

데이터 읽기

데이터 읽기를 실행하려면 텍스트 파일이 필요합니다. 아래와 같은 텍스트 파일을 메모장으로 작성하여 저장합니다.

홍길동 010-1234-5678
김봉민 010-1234-5679
강슬기 010-1234-5680

 

read() 함수는 파일 객체에서 하나의 문자를 읽습니다. 만약 여러 개의 문자를 읽으려면 read(10)과 같이 문자의 개수를 전달하면 됩니다.

phones.txt에서 문자 10개를 읽어서 출력하는 코드는 아래와 같습니다.

  • 파일 이름 : phones.txt
infile = open("phones.txt", "r")
s = infile.read(10)
print(s)
infile.close()

 

<실행 결과>

홍길동 010-12

 

readline()은 한 줄을 읽습니다. 파일 phones.txt에는 3줄이 저장되어 있으므로 readline()은 3번 호출하여 화면에 출력하여 봅시다.

infile = open("phones.txt", "r")

for i in range(3):
    s = infile.readline()
    print(s)

infile.close()

 

<실행 결과>

홍길동 010-1234-5678

김봉민 010-1234-5679

강슬기 010-1234-5680

 

하지만 일반적으로는 파일에 몇 줄에 들어 있는지는 미리 알 수가 없습니다. 파일의 크기가 크고 한 줄씩 읽어서 처리하려면 다음과 같은 방법을 사용하는 것이 좋습니다.

infile = open("phones.txt", "r")
line = infile.readline()

while line != "":
    print(line)
    line = infile.readline()

infile.close()

 

<실행 결과>

홍길동 010-1234-5678

김봉민 010-1234-5679

강슬기 010-1234-5680

 

다음과 같은 문장을 사용하여 파일 안의 내용을 읽어도 됩니다. 파이썬은 파일 객체를 문자열의 컨테이너로 간주합니다.

따라서 파일에서 문자열을 읽을 때는 for 루프를 이용하여 파일 객체에 대하여 반복하여도 됩니다.

infile = open("phones.txt", "r")

for line in infile:
    line = line.rstrip()
    print(line)

infile.close()

 

각 반복에서 line 변수는 파일에서 다음에 읽을 문자열로 대입됩니다. 반복 루프의 몸체에서 이 텍스트를 처리하면 됩니다.

여기서는 단순히 화면에 문자열을 출력하였습니다. rstrip()은 문자열의 오른쪽 공백 문자를 제거하는 메소드입니다. 파일에서 줄 마지막에 붙은 \n을 제거할 때 유용합니다.

 

<실행 결과>

홍길동 010-1234-5678
김봉민 010-1234-5679
강슬기 010-1234-5680

 

데이터 쓰기

파일에 데이터를 쓰려면 open()으로 파일 객체를 생성한 후 에 write() 함수를 이용하여 데이터를 저장합니다.

open()을 호출할 때는 파일 모드로 "w"를 주어야 합니다. 아래 코드에서 3개의 문자열을 phones.txt 파일에 저장하고 있습니다.

outfile = open("phones.txt", "w")

outfile.write("강슬기 010-1234-5678")
outfile.write("김봉민 010-1234-5679")
outfile.write("김영희 010-1234-5680")

outfile.close()

 

파일에 데이터를 쓰려면 파일을 열 때, "w" 모드를 사용합니다. 만약 동일한 이름의 파일이 디스크에 존재하면 기존의 데이터는 없어지고 새로운 데이터가 덮어써집니다.

 

만약 파일이 존재하는지를 검사하려면 아래와 같은 코드를 추가하여야 합니다.

import os.path

outfile = open("phones.txt", "w")

if os.path.isfile("phones.txt"):
    print("동일한 이름의 파일이 이미 존재합니다.")
else:
    outfile.write("김봉민 010-1234-5678")
    outfile.write("김철수 010-1234-5679")
    outfile.write("강슬기 010-1234-5680")

outfile.close()

 

도전 과제

서천빌리지에 사는 봉민이는 근처 상가에 코인노래방을 하나 지으면 대박이 날 것이라고 항상 이야기하고 다닙니다. 코인 노래방의 수익을 계산할 장부 프로그램을 만들어 봅시다.

텍스트 파일에 코인노래방의 매출이 저장되어 있다고 합시다. 이것을 읽어서 평균 매출과 총 매출을 계산한 후에 다른 파일에 출력하는 프로그램을 작성해봅시다.

 

<입력 파일>

1000000
1000000
1000000
500000
1500000

 

<실행 결과>

입력 파일 이름 : sales.txt
출력 파일 이름 : summary.txt

 

<출력 파일>

총 매출 = 5000000
평균 일매출 = 1000000.0