이 페이지의 목차
파일이란 무엇인가
코드 예제: Python · C · 예상 50분
학습 목표
- 파일의 개념과 프로그램이 지원하는 파일 유형을 설명한다.
- 파일을 열고 닫는 과정을 설명한다.
관련 성취기준
- 프그02-06
파일의 개념을 이해하고 지원하는 파일 유형을 사용하여 입력과 출력 과정을 설명할 수 있으며, 파일을 입출력하는 프로그램을 작성할 수 있다.
생각 열기 — 프로그램을 다시 켜면
16차시에서 만든 성적 관리 프로그램으로 점수를 서른 개 넣었다. 결과를 확인하고 프로그램을 닫았다.
다음 시간에 다시 열었더니 아무것도 없다. 서른 개를 처음부터 다시 넣어야 한다.
값이 사라지는 까닭
프로그램이 도는 동안 변수는 메모리에 있다. 메모리는 전기가 흐르는 동안만 값을 붙잡아 두는 장치이고, 프로그램이 끝나면 그 자리를 운영체제가 회수한다.
| 메모리 (변수) | 파일 | |
|---|---|---|
| 어디에 있나 | RAM | 디스크·SSD |
| 프로그램이 끝나면 | 사라진다 | 남는다 |
| 빠르기 | 아주 빠르다 | 훨씬 느리다 |
| 크기 | 한정돼 있다 | 훨씬 크다 |
| 쓰는 법 | 변수 이름 | 이름으로 열고 읽고 쓴다 |
파일(file) — 이름을 붙여 저장 장치에 남겨 둔 자료 덩어리은 이름을 붙여 저장 장치에 남긴 자료다. 프로그램이 끝나도, 컴퓨터를 껐다 켜도 남아 있다. 이 성질을 데이터 지속성이라 한다.
파일의 두 갈래
| 텍스트 파일 | 이진 파일 | |
|---|---|---|
| 담는 것 | 사람이 읽을 수 있는 글자 | 값을 그대로 담은 바이트 |
| 메모장으로 열면 | 내용이 보인다 | 깨진 기호가 보인다 |
| 보기 | .txt, .csv, .py, .c, .html | .jpg, .mp3, .exe, .zip |
| 크기 | 숫자를 글자로 적어 더 크다 | 작다 |
| 다루기 | 쉽다. 눈으로 확인된다 | 어렵다. 형식을 알아야 한다 |
이 차시에서는 텍스트 파일만 다룬다. 눈으로 확인할 수 있어 배우기 좋고, 3단원 8차시에서 다룬 대로 결과를 사람이 검증할 수 있기 때문이다.
열고 · 다루고 · 닫는다
파일을 쓰는 일은 늘 세 걸음이다.
- 1걸음
연다
이름과 목적(읽기·쓰기)을 알려 준다. 운영체제가 그 파일을 준비해 준다.
- 2걸음
읽거나 쓴다
한 줄씩, 또는 전체를 한 번에 다룬다.
- 3걸음
닫는다
다 썼다고 알린다. 닫지 않으면 쓴 내용이 남지 않을 수 있다.
with open("memo.txt", "w", encoding="utf-8") as f:
f.write("첫째 줄\n")
f.write("둘째 줄\n")
with open("memo.txt", "r", encoding="utf-8") as f:
내용 = f.read()
print("파일 전체:")
print(내용, end="")
with open("memo.txt", "r", encoding="utf-8") as f:
for 번호, 줄 in enumerate(f, 1):
print(번호, 줄.rstrip())파일 전체: 첫째 줄 둘째 줄 1 첫째 줄 2 둘째 줄
#include <stdio.h>
#include <string.h>
int main(void)
{
FILE *f = fopen("memo.txt", "w");
if (f == NULL) { printf("파일을 열지 못했다\n"); return 1; }
fprintf(f, "첫째 줄\n");
fprintf(f, "둘째 줄\n");
fclose(f);
char line[256];
f = fopen("memo.txt", "r");
if (f == NULL) { printf("파일을 열지 못했다\n"); return 1; }
printf("파일 전체:\n");
while (fgets(line, sizeof line, f) != NULL)
printf("%s", line);
fclose(f);
int no = 1;
f = fopen("memo.txt", "r");
while (fgets(line, sizeof line, f) != NULL) {
line[strcspn(line, "\n")] = '\0';
printf("%d %s\n", no++, line);
}
fclose(f);
return 0;
}파일 전체: 첫째 줄 둘째 줄 1 첫째 줄 2 둘째 줄
파일 모드 — 무엇을 할지 알려 준다
여는 목적을 파일 모드(file mode) — 파일을 여는 목적. 읽기·쓰기·이어 쓰기 중 무엇인지 알려 준다로 알려 준다.
| 모드 | 뜻 | 파일이 없으면 | 파일이 있으면 |
|---|---|---|---|
"r" | 읽기 | 오류 | 처음부터 읽는다 |
"w" | 쓰기 | 새로 만든다 | 내용을 전부 지우고 처음부터 쓴다 |
"a" | 이어 쓰기 | 새로 만든다 | 끝에 덧붙인다 |
닫는 일을 빠뜨리지 않는 방법
Python의 with open(...) as f: 는 블록이 끝나면 자동으로 닫아 준다. 오류가 나서 중간에 빠져나가도 닫힌다. 그래서 Python에서는 이 방식만 쓰면 된다.
C에는 이런 장치가 없어 fclose(f) 를 직접 적어야 한다. 중간에 return 으로 빠져나가는 길이 있으면 그 앞에도 적어야 한다.
| 하려는 일 | Python | C |
|---|---|---|
| 열기 | open(이름, 모드) | fopen(이름, 모드) |
| 열기 실패 확인 | 오류가 발생한다 | NULL 인지 반드시 확인 |
| 한 줄 쓰기 | f.write("글\\n") | fprintf(f, "글\\n") |
| 전체 읽기 | f.read() | 반복으로 한 줄씩 모은다 |
| 한 줄씩 읽기 | for 줄 in f: | fgets(line, 크기, f) |
| 닫기 | with 가 자동으로 | fclose(f) |
한글과 파일 이름
두 가지를 짚어 둔다.
- 파일 안의 한글 — Python은
encoding="utf-8"을 적어 준다. 적지 않으면 컴퓨터마다 다른 방식으로 읽어 한글이 깨질 수 있다. 1단원 8차시에서 다룬 글자 설정 문제가 파일에서 가장 자주 나타난다. - 파일 이름의 한글 — 위 예제의 파일 이름이
memo.txt인 것에 이유가 있다. Windows에서 C의fopen은 한글 파일 이름을 제대로 열지 못한다. UTF-8로 적힌 이름을 다른 방식으로 해석하기 때문이다. 그래서 이 교과서의 C 예제는 파일 이름을 영문으로 쓴다.
활동
파일을 열고 내용을 읽어 화면에 출력하기
약 25분1단계 — 모드를 바꿔 본다 (10분)
실행기의 [고치기]로 모드만 바꿔 가며 확인한다. 먼저 예상을 적는다.
| 시도 | 예상 | 실제 |
|---|---|---|
"w" 로 두 줄 쓰고 다시 "w" 로 한 줄 쓰기 → 읽으면 몇 줄? |
||
"a" 로 한 줄 더 쓰고 읽으면 몇 줄? |
||
없는 파일을 "r" 로 열면? |
||
없는 파일을 "a" 로 열면? |
세 번째에서 나는 오류 이름을 적는다.
2단계 — 읽는 방식을 바꿔 본다 (5분)
| 방식 | 결과 |
|---|---|
f.read() — 전체를 한 문자열로 |
|
f.readlines() — 줄 목록으로 |
|
for 줄 in f: — 한 줄씩 |
- 줄 끝의 줄바꿈이 값에 포함되는가?
rstrip()을 빼고 확인해 본다. - 왜
print(내용, end="")에서end=""를 썼는가? (5차시)
3단계 — 줄 번호를 붙인다 (5분)
읽은 내용에 줄 번호를 붙여 찍는다. 이미 예제에 있으니 번호를 0부터 시작하게 바꿔 보자.
enumerate(f, 1)의1을 무엇으로 바꾸면 되는가?- C에서는 어디를 고치는가?
4단계 — 실패를 다뤄 본다 (5분)
없는 파일을 읽으려 할 때 프로그램이 멈추지 않게 만든다.
- Python:
try / except FileNotFoundError로 감싼다. - C:
fopen결과가NULL인지 확인한다. - 3단원 3차시 설계서 형식으로 「실패하면」 칸을 채워 본다.
| 함수 | 실패하면 |
|---|---|
| 파일 읽기 |
개념 확인 문제
보기를 누르면 바로 채점된다. 틀려도 해설을 읽으면 된다.
프로그램이 끝나면 변수에 담은 값이 사라지는 까닭은?프그02-06
이미 내용이 있는 파일을 「w」 모드로 열면?프그02-06
Python의 with open(...) as f: 를 쓰는 이점은?프그02-06
C에서 fopen 의 결과가 NULL 인지 반드시 확인하는 까닭은?프그02-06
텍스트 파일과 이진 파일에 대한 설명으로 알맞지 않은 것은?프그02-06
Python에서 파일을 열 때 encoding=「utf-8」 을 적는 까닭은?프그02-06
더 알아보기
심화파일 위치를 어떻게 찾나
open("memo.txt") 라고만 적으면 파일이 어디에 만들어질까. 프로그램이 실행된 폴더다. 이것을 현재 작업 폴더라 한다. 그래서 같은 코드를 다른 폴더에서 실행하면 다른 곳에 파일이 생긴다.
정확한 위치를 정하려면 전체 경로를 적는다 — open("D:/자료/memo.txt"). 다만 그러면 다른 컴퓨터에서 안 돌아간다. 그래서 실무에서는 프로그램 파일의 위치를 기준으로 경로를 만든다. 이 문제는 학교 컴퓨터마다 폴더 구조가 달라 특히 자주 걸리므로, 파일이 안 열리면 “어느 폴더에서 실행했는가”를 먼저 확인해 볼 만하다.
심화줄바꿈 글자가 컴퓨터마다 다르다
줄을 바꾸는 표시가 운영체제마다 다르다. Windows는 두 글자(\r\n), 리눅스와 macOS는 한 글자(\n)를 쓴다. 그래서 Windows에서 만든 텍스트 파일을 다른 곳에서 열면 줄 끝에 이상한 기호가 보이거나, 반대로 줄이 안 바뀌어 보일 수 있다.
Python은 파일을 텍스트 모드로 열면 이 차이를 알아서 맞춰 준다. C에서는 fgets 로 읽은 줄 끝에 \r 이 남을 수 있어, 위 예제처럼 줄바꿈을 잘라 내는 처리가 필요하다. 3단원 6차시에서 「합칠 때 어긋나는 자리」를 다뤘는데, 다른 운영체제와 파일을 주고받는 것도 그 어긋남이 생기는 자리다.
실무쉼표로 나눈 표 — CSV
표를 텍스트 파일에 담는 가장 흔한 방법이다. 한 줄이 한 행이고 칸을 쉼표로 나눈다.
이름,국어,영어
학생1,88,92
학생2,70,80확장자는 .csv 이고 엑셀에서도 열린다. 텍스트 파일이라 눈으로 확인할 수 있고, 3차시에서 배운 문자열 나누기로 읽을 수 있다. 프로그램과 표 계산 프로그램이 자료를 주고받는 다리 구실을 해서 실무에서 아주 널리 쓰인다.
다만 값 안에 쉼표가 들어가면 칸이 어긋난다. 그때는 값을 따옴표로 감싸는 규칙을 쓴다 — 간단해 보이는 형식에도 정해 둘 것이 있다는 이야기다.
이어지는 학습
이 차시를 이해하려면 다음을 먼저 알아야 한다.
- 16차시의 함수로 나눈 프로그램 구조 — 프로그래밍 프그02-05
교과서에서 찾기
| 교과서 | 해당 위치 | 쪽수 |
|---|---|---|
| 성림출판(Python) | 프로그래밍의 기초 › 06 파일 처리 | 190쪽 |
| 씨마스커뮤니케이션(Python) | 프로그래밍 기초 › 6 파일 처리 | 162쪽 |
| 삼양미디어(Python) | 프로그래밍의 기초 › 05 파일 처리 | 148쪽 |
| 삼양미디어(C) | 프로그래밍의 기초 › 05 파일 처리 | 152쪽 |
| 씨마스(C) | C 프로그래밍의 기초 › 9 파일 입출력 | 164쪽 |
| 웅보출판사(C) | 프로그래밍의 기초 › Chapter 07 파일 처리 | 175쪽 |