Skip to Main Content

파이썬 기초 가이드: 파일

코딩 학습 가이드는 소프트웨어학과 송오영교수님이 검수하였습니다.

실습용 텍스트 파일 만들기

실습을 위하여 텍스트 파일을 생성합니다.
윈도우에서는 "메모장" 프로그램을 실행하여서 친구들의 연락처를 입력한 후에 "phone.txt" 파일로 저장합니다.

 

저장 창에서 인코딩을 UTF-8로 선택해야 파이썬에서 한글이 깨지지 않습니다.

파일

데이터를 영구 보관하려면 파일에 저장해야 합니다.

1. 파일을 사용하려면 먼저 파일을 열어야 합니다. 파일을 여는 함수 open()은 파일 이름을 받아서 파일 객체를 생성한 후에 반환합니다.
2. 파일이 열리면 파일에서 데이터를 읽거나 씁니다.
3. 파일 작업이 모두 종료되면 파일을 닫아야 합니다. close() 함수를 사용해 사용이 끝난 파일을 닫습니다.

파일을 사용하기 위해서는 다음과 같은 함수를 사용합니다.

형식

파일 객체 = open("파일의 이름", "파일을 여는 모드")
...
파일 객체.close()

 파일을 닫아야 하는 이유는 다른 프로그램이 파일을 사용할 수 있기 때문입니다.
       파일을 열어서 사용하고 있으면 다른 프로그램은 파일에 접근할 수 없습니다.
       따라서 파일은 사용이 끝나면 닫는 것이 좋습니다.


파일 모드

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

파일에서 전체 데이터 읽기

파일에서 데이터를 읽는 함수는 파일 객체의 read() 메소드입니다. read() 함수는 파일 객체에서 전체 텍스트를 읽습니다. 만약 지정된 개수의 문자만 읽으려면 read(숫자)와 같이 문자의 개수를 전달합니다.

1
2
3
4
infile = open("c:\\project\\phone.txt""r", encoding="utf-8")
lines = infile.read()
print(lines)
infile.close()
 

 

실행결과

홍길동 010-1111-1111
홍길순 010-2222-2222
김철수 010-3333-3333
김영희 010-4444-4444

파일에서 전체 데이터를 읽는 함수는 readlines()도 있습니다.

1
2
3
4
infile = open("c:\\project\\phone.txt""r", encoding="utf-8")
lines = infile.readlines()
print(lines)
infile.close()
 

 

실행결과

['홍길동 010-1111-1111\n', '홍길순 010-2222-2222\n', '김철수 010-3333-3333\n', '김영희 010-4444-4444\n']

readlines()로 읽으면 파일에 저장된 각각의 줄이 리스트 안에 저장됩니다. 리스트 안의 하나의 항목은 파일에 저장된 하나의 줄에 해당합니다. 맨 끝에 붙은 \n은 줄 바꿈 기호입니다.

파일에서 한 줄씩 읽기

readlines() 함수는 한 번에 파일의 모든 줄을 읽습니다.
만약 한번에 하나의 줄만 읽기를 원한다면 readline() 함수를 사용합니다.
한 줄씩 읽어서 처리하려면 다음과 같은 방법을 사용하는 것이 좋습니다.

파일에서 읽을 때 줄의 맨 끝에 있는 줄 바꿈 기호를 삭제하고 읽어야 합니다.
파이썬에서는 rsprip() 메소드가 이런 작업을 합니다.
각 반복에서 line 변수는 파일에서 다음에 읽을 문자열로 대입됩니다. 반복 루프의 몸체에서 이 텍스트를 처리합니다.

while문 사용

infile = open("c:\\project\\phone.txt", "r", encoding="utf-8")
lines = infile.readline().rstrip()
while line != "":
    print(line)
    line = infile.readline().rstrip()
infile.close()

for문 사용

infile = open("c:\\project\\phone.txt", "r", encoding="utf-8")
for line in infile:
    line = line.rsprip()
    print(line)
infile.close()

파일에 데이터 쓰기

파일에 데이터를 쓰려면 open()으로 파일 객체를 생성한 후에 write() 함수를 이용하여 데이터를 저장합니다.
open()으로 열 때 w 모드를 사용합니다.
만약 동일한 이름의 파일이 디스크에 존재하면 기존의 데이터는 없어지고 새로운 데이터가 덮어써집니다.

1
2
3
4
5
6
7
8
outfile = open("c:\\project\\phone2.txt""w", encoding="utf-8")
 
outfile.write("홍길동 010-1111-1111\n")
outfile.write("홍길순 010-2222-2222\n")
outfile.write("김철수 010-3333-3333\n")
outfile.write("김영희 010-4444-4444\n")
 
outfile.close()
 

 

디렉터리로 가서 phone2.txt가 생성되었는지를 확인합니다.

파일에 데이터 추가하기

기존의 파일에 새로운 데이터를 추가하려면 파일 모드 a를 사용하면 됩니다. a는 append의 약자입니다.

1
2
3
4
5
6
7
outfile = open("c:\\project\\phone.txt""a", encoding="utf-8")
 
outfile.write("김감돌 010-5555-5555\n")
outfile.write("김하나 010-6666-6666\n")
outfile.write("이두나 010-7777-7777\n")
 
outfile.close()
 

 

디렉터리로 가서 phone.txt에 추가되었는지를 확인합니다.

인코딩(Encoding)

인코딩은 문자를 처리하는 방식입니다. 기본적으로 영어만 쓴다면 encoding='문자 세트'를 생략해도 됩니다. 하지만 한글/일본어/중국어 등을 처리하려면 인코딩의 문자세트를 지정해 줘야 글자가 깨지지 않습니다. 문자세트에는 ASCII, EUC-KR, CP949, 유니코드, utf-8 등이 있으며 utf-8은 영문/한글 등에 별 문제없이 많이 사용됩니다.

바이너리 파일

지금까지 작성한 프로그램들은 모두 텍스트 파일의 입출력 작업을 하는 프로그램입니다. 텍스트 파일은 우리가 읽을 수 있는 글자로 구성된 파일이라고 보면 됩니다. 이와 달리 바이너리 파일은 글자가 아닌 비트 단위로 의미가 있는 파일을 말합니다.

바이너리 파일은 텍스트 파일을 제외한 나머지 대부분의 파일입니다. 예로 그림, 음악, 동영상, 엑셀 파일 등이 모두 바이너리 파일이라고 보면 됩니다.

바이너리 파일을 처리하기 위해서는 read() 함수를 이용해서 한 바이트씩 읽고 write() 함수를 이용해서 한 바이트씩 쓰는 작업을 파일에서 읽을 것이 없을 때까지 무한 반복합니다.

'\' 역슬래시(백슬래시)

'\' 역슬래시(백슬래시)는 슬래시(/)를 반대로 한 기호입니다.

마이크로소프트의 기본 한국어 글꼴에서는 역슬래시를 원화 기호(\)로 그려 놓았습니다. 따라서 역슬래시를 입력할 때는 원화 기호(\)를 입력하면 됩니다.

한국어 글꼴에서는 \로 일본어 글꼴에서는 ¥로 그 외 글꼴에서는 \로 보입니다.