프로그래밍웹 교과서
이 페이지의 목차
2단원 · 17차시

파일이란 무엇인가

파일텍스트 파일이진 파일파일 열기와 닫기파일 모드

코드 예제: Python · C · 예상 50분

학습 목표

  • 파일의 개념과 프로그램이 지원하는 파일 유형을 설명한다.
  • 파일을 열고 닫는 과정을 설명한다.

관련 성취기준

  • 프그02-06

    파일의 개념을 이해하고 지원하는 파일 유형을 사용하여 입력과 출력 과정을 설명할 수 있으며, 파일을 입출력하는 프로그램을 작성할 수 있다.

생각 열기 — 프로그램을 다시 켜면

16차시에서 만든 성적 관리 프로그램으로 점수를 서른 개 넣었다. 결과를 확인하고 프로그램을 닫았다.

다음 시간에 다시 열었더니 아무것도 없다. 서른 개를 처음부터 다시 넣어야 한다.

값이 사라지는 까닭

프로그램이 도는 동안 변수는 메모리에 있다. 메모리는 전기가 흐르는 동안만 값을 붙잡아 두는 장치이고, 프로그램이 끝나면 그 자리를 운영체제가 회수한다.

메모리와 파일
메모리 (변수)파일
어디에 있나RAM디스크·SSD
프로그램이 끝나면사라진다남는다
빠르기아주 빠르다훨씬 느리다
크기한정돼 있다훨씬 크다
쓰는 법변수 이름이름으로 열고 읽고 쓴다

파일(file) — 이름을 붙여 저장 장치에 남겨 둔 자료 덩어리은 이름을 붙여 저장 장치에 남긴 자료다. 프로그램이 끝나도, 컴퓨터를 껐다 켜도 남아 있다. 이 성질을 데이터 지속성이라 한다.

파일의 두 갈래

텍스트 파일과 이진 파일
텍스트 파일이진 파일
담는 것사람이 읽을 수 있는 글자값을 그대로 담은 바이트
메모장으로 열면내용이 보인다깨진 기호가 보인다
보기.txt, .csv, .py, .c, .html.jpg, .mp3, .exe, .zip
크기숫자를 글자로 적어 더 크다작다
다루기쉽다. 눈으로 확인된다어렵다. 형식을 알아야 한다

이 차시에서는 텍스트 파일만 다룬다. 눈으로 확인할 수 있어 배우기 좋고, 3단원 8차시에서 다룬 대로 결과를 사람이 검증할 수 있기 때문이다.

열고 · 다루고 · 닫는다

파일을 쓰는 일은 늘 세 걸음이다.

  • 1걸음

    연다

    이름과 목적(읽기·쓰기)을 알려 준다. 운영체제가 그 파일을 준비해 준다.

  • 2걸음

    읽거나 쓴다

    한 줄씩, 또는 전체를 한 번에 다룬다.

  • 3걸음

    닫는다

    다 썼다고 알린다. 닫지 않으면 쓴 내용이 남지 않을 수 있다.

Python파일에 쓰고 다시 읽기
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 둘째 줄
C파일에 쓰고 다시 읽기확인된 출력
#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 으로 빠져나가는 길이 있으면 그 앞에도 적어야 한다.

파일을 다루는 문법 비교
하려는 일PythonC
열기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쪽