기본 콘텐츠로 건너뛰기

방송대 방통대 파이썬프로그래밍기초 12강 - 파일의 이해와 파이썬 파일 처리 - 요약 노트 시험족보 예상문제 - 올에이클래스

파이썬프로그래밍기초 12강 - 파일의 이해와 파이썬 파일 처리

파이썬프로그래밍기초 12강 - 파일의 이해와 파이썬 파일 처리

데이터의 영속성과 파일 시스템, 경로와 파일의 종류를 이해한다. 이어서 파이썬의 파일 열기·읽기·쓰기·추가·닫기 방법을 익히고, 대용량 파일을 효율적으로 읽고 정제·분리·변환하여 서버 로그 리포트를 만드는 과정을 학습한다.

제1장 파일의 이해

1. 휘발성과 영속성

프로그램이 실행되는 동안 명령과 데이터는 주기억장치에 저장된다. 일반적인 RAM은 휘발성 기억장치이므로 전원이 끊기거나 프로그램 실행이 끝나면 저장된 데이터가 사라질 수 있다.

영속성(persistence)은 데이터를 생성한 프로그램의 실행이 종료된 뒤에도 데이터가 사라지지 않고 계속 남아 있는 속성이다. 데이터를 다음 실행에서도 사용하거나 다른 프로그램과 공유하려면 비휘발성 보조기억장치에 기록해야 한다.

구분특징
휘발성전원 차단이나 실행 종료 시 데이터가 소실될 수 있음RAM의 실행 중 데이터
비휘발성·영속성전원이 없어도 기록이 유지됨HDD, ODD, USB, SSD의 파일

파일의 필요성

프로그램 실행이 끝난 뒤에도 데이터를 보존하려면 보조기억장치에 파일 형태로 저장해야 한다.

2. 보조기억장치와 파일 시스템

보조기억장치는 전원이 소실되어도 저장된 정보가 훼손되지 않는 영구적 기록장치이다. 운영체제는 보조기억장치 위에 파일 시스템을 구축하고, 파일이라는 논리적 단위를 통해 데이터 저장 기능을 제공한다.

파일 시스템은 루트(root)에서 시작해 가지처럼 뻗어 나가는 계층적 트리 구조를 사용한다. Windows의 루트는 드라이브 이름과 역슬래시로, Unix 계열에서는 슬래시로 표현할 수 있다.

디렉터리 또는 폴더는 파일과 하위 디렉터리를 포함하는 컨테이너이다. 경로(path)는 파일 시스템에서 특정 파일이나 디렉터리의 위치를 나타내는 주소이다. 예를 들어 /var/etc/python.py는 루트 아래 var, etc 디렉터리를 거쳐 python.py 파일에 도달하는 위치를 표현한다.

3. 절대 경로와 상대 경로

절대 경로(absolute path)는 최상위 루트 디렉터리부터 목표 파일까지의 전체 경로를 모두 명시한다. 현재 작업 디렉터리가 달라져도 같은 위치를 가리킨다. 예를 들어 /var/etc/python.py가 절대 경로이다.

상대 경로(relative path)는 현재 작업 디렉터리를 기준으로 목표 파일의 위치를 지정한다. 점 하나 .는 현재 디렉터리, 점 두 개 ..는 상위 디렉터리를 의미한다. 현재 위치에 따라 같은 상대 경로가 다른 파일을 가리킬 수 있다.

구분기준
절대 경로루트부터 목표까지 전체 위치/var/etc/python.py
상대 경로현재 작업 디렉터리../etc/python.py
현재 디렉터리현재 위치 자체./python.py
상위 디렉터리현재 위치의 부모../

4. 파일의 개념과 구성

파일은 보조기억장치에 저장된 데이터의 논리적 집합이다. 데이터 파일을 프로그램이 처리·가공하여 정보 파일로 만들 수 있다.

파일은 파일명, 확장자와 내용으로 설명할 수 있다. 파일명은 파일을 식별하는 고유 문자열이다. 확장자는 .txt, .py, .csv처럼 파일의 형식을 나타내는 접미사이다. 내용은 컴퓨터가 처리할 데이터와 정보이다.

5. 텍스트 파일과 바이너리 파일

텍스트 파일은 사람이 읽을 수 있는 문자로 구성된다. 각 문자는 특정 인코딩 방식에 따라 비트열로 변환되어 저장된다. 메모장이나 코드 편집기에서 내용을 직접 확인할 수 있다.

바이너리 파일은 텍스트가 아닌 이진 데이터로 저장하며 이미지, 음원, 실행 파일 등이 포함된다. 일반 텍스트 편집기만으로 의미를 해석하기 어렵고 파일 형식에 맞는 전용 소프트웨어가 필요하다.

구분내용해석
텍스트 파일문자 인코딩으로 표현된 문자열사람이 텍스트 편집기로 읽을 수 있음
바이너리 파일이미지·음원·실행파일 등의 이진 데이터형식에 맞는 소프트웨어가 필요

6. 파일의 내부 표현과 인코딩

파일은 연속된 바이트로 구성되며 파일의 시작, 현재 작업 위치인 파일 포인터, 파일의 끝인 EOF(End of File)로 표현할 수 있다. 읽기와 쓰기를 수행하면 파일 포인터가 이동한다.

주요 문자 인코딩에는 ASCII, EUC-KR(CP949), UTF-8이 있다. ASCII는 7비트 기반으로 영문과 기본 특수문자를 표현한다. EUC-KR은 완성형 한글 표현 방식이며 Windows에서 CP949로 확장되어 사용되지만 호환성 문제가 있을 수 있다. UTF-8은 유니코드 기반 가변길이 문자 인코딩으로 세계 모든 문자 표현을 목표로 하며 국제 표준으로 널리 사용된다.

인코딩 일치

파일을 저장할 때 사용한 문자 인코딩과 읽을 때 지정한 인코딩이 다르면 한글이 깨지거나 디코딩 오류가 발생할 수 있다.

제2장 파이썬 파일 입출력

1. 파일 입출력의 3단계

파일 입출력은 open, access, close의 세 단계로 진행한다. 먼저 파일 객체를 생성하여 운영체제로부터 파일 접근 권한을 얻는다. 이때 파일명, 모드와 인코딩을 설정한다.

접근 단계에서는 생성한 파일 객체의 메소드를 이용해 데이터를 읽거나 쓴다. 작업이 끝나면 파일 객체를 닫아 점유한 메모리와 파일 핸들을 운영체제에 반환하고 데이터 무결성을 유지한다.

3단계 메커니즘

파일 열기(open) → 데이터 접근(read/write) → 파일 닫기(close)

2. 파일 관련 함수와 메소드

함수·메소드의미
open()파일과 연결된 파일 객체 생성
read()특정 개수 또는 나머지 전체 문자열 반환
readline()한 줄의 문자열 반환
readlines()전체 라인을 문자열 리스트로 반환
write(s)문자열 s를 파일에 기록
close()파일을 닫고 파일 객체와 자원을 정리

3. 파일 객체 생성과 모드

open()은 파일명, 모드와 인코딩을 인수로 받아 파일 객체를 반환한다.

파일객체 = open(파일이름, 모드, encoding=인코딩)
모드의미기존 파일 처리
r읽기파일이 존재해야 함
w새로운 파일 쓰기기존 내용 삭제 후 처음부터 기록
a파일 끝에 데이터 추가기존 내용 보존
j_fp = open("Jobs.txt", "r", encoding="utf-8")

4. read()로 읽기

read(n)은 현재 파일 포인터 위치부터 n개의 문자를 읽어 문자열로 반환한다. n을 생략하면 현재 위치에서 EOF까지 남은 전체 내용을 읽는다. 읽은 만큼 파일 포인터가 뒤로 이동한다.

j_fp = open("Jobs.txt", "r", encoding="utf-8")
first6 = j_fp.read(6)
left = j_fp.read()

첫 호출이 6문자를 읽은 뒤 포인터를 이동하므로 두 번째 호출은 처음부터가 아니라 남은 부분만 반환한다.

5. readline()과 readlines()

readline()은 호출할 때마다 한 줄씩 읽어 문자열로 반환한다. 줄 끝의 개행문자도 포함될 수 있다. readlines()는 전체 줄을 읽어 각 줄을 원소로 갖는 문자열 리스트를 반환한다.

j_fp = open("Jobs.txt", "r", encoding="utf-8")
first_line = j_fp.readline()
second_line = j_fp.readline()
lines = j_fp.readlines()

연속된 readline() 호출은 파일 포인터가 가리키는 다음 줄을 차례로 읽는다. readlines()는 작은 파일을 줄 단위 리스트로 한꺼번에 다룰 때 편리하다.

6. write()로 쓰기

write()는 문자열 데이터를 인수로 받아 현재 파일 포인터 위치에 기록한다. 줄바꿈은 자동으로 추가되지 않으므로 필요한 위치에 \n을 명시해야 한다.

p_fp = open("python.txt", "w", encoding="utf-8")
p_fp.write("KNOU\n")
p_fp.write("python programming\n")

w 모드로 기존 파일을 열면 이전 데이터가 삭제된다. 새 파일을 만들거나 내용을 완전히 교체할 때 사용한다.

7. append 모드로 데이터 추가

a 모드는 기존 파일 끝에 데이터를 덧붙인다. 파일을 열면 파일 포인터가 EOF로 이동하고 기존 내용은 보존된다.

p_fp = open("python.txt", "a", encoding="utf-8")
p_fp.write("by CS\n")

로그처럼 기존 기록을 유지하면서 새로운 항목을 계속 추가해야 하는 경우에 적합하다.

8. close()로 파일 닫기

close()는 파일 객체가 점유한 메모리와 파일 핸들을 운영체제에 반환한다. open()으로 파일을 열었다면 대응하는 위치에 close()가 있어야 한다.

p_fp.close()

파일을 닫으면 임시 버퍼에 남은 데이터를 실제 파일에 반영하여 데이터 무결성을 높이고, 운영체제의 파일 열기 개수와 메모리 등 자원 누수를 막는다. 프로그램이 비정상 종료되어 열린 파일이 ‘사용 중’ 상태로 잠기면 다른 프로그램에서 접근하지 못할 수 있다.

9. 명언 파일 처리 사례

강의록은 Khan.txt 파일을 읽어 모든 내용을 출력하고 파일 마지막에 저자를 삽입하는 프로그램을 제시한다. 읽기 모드로 내용을 확인한 뒤 파일을 닫고, 추가 모드로 다시 열어 저자 문자열을 기록한다.

fp = open("Khan.txt", "r", encoding="utf-8")
contents = fp.read()
fp.close()
print(contents)

fp = open("Khan.txt", "a", encoding="utf-8")
fp.write("\n- 칭기즈 칸")
fp.close()

모드 선택

기존 명언을 보존하고 저자만 마지막에 붙여야 하므로 두 번째 열기에서는 w가 아니라 a 모드를 사용한다.

제3장 효과적인 파일 처리와 데이터 파싱

1. 데이터 파싱의 개념

파일에서 읽은 데이터는 단순한 문자열 형태로 곧바로 처리하기 어려울 수 있다. 데이터 파싱(parsing)은 일련의 문자열을 문법적 규칙에 따라 분해하고 의미 있는 단위로 변환하는 과정이다.

일반적인 파싱 과정은 읽기, 정제, 분리, 변환의 순서로 진행한다. 먼저 파일에서 문자열을 읽고 불필요한 공백과 개행을 제거한다. 구분자를 기준으로 필드를 나눈 뒤 숫자·날짜 등 필요한 자료형으로 변환한다.

파싱 과정

읽기 → 정제 → 분리 → 변환

2. 대용량 파일의 줄 단위 처리

GB 크기의 파일 전체를 read()로 한 번에 메모리에 올리면 메모리 오버플로가 발생할 수 있다. 파일 객체를 반복하면 한 번에 한 줄만 메모리에 적재하여 처리할 수 있어 대용량 데이터에 효율적이다.

for line in file:
    fields = line.split(",")

현재 줄의 처리가 끝나면 다음 줄로 넘어가므로 파일 크기 전체에 비례하는 메모리를 한꺼번에 요구하지 않는다.

3. 문자열 정제와 분리

텍스트 앞뒤에는 개행문자 \n, 공백, 탭 \t 등 불필요한 문자가 포함될 수 있다. 그대로 비교 연산을 수행하면 화면에는 같아 보여도 문자열이 달라 오류가 생길 수 있다.

clean_line = line.strip()
fields = clean_line.split(",")

strip()은 문자열 앞뒤의 공백류 문자를 제거한다. split(",")은 쉼표를 기준으로 문자열을 여러 필드로 분리하여 리스트로 반환한다. CSV 데이터를 처리할 때 기본적으로 활용할 수 있다.

4. 서버 로그 리포트 작성

강의록은 CSV 형식의 서버 로그를 읽고 HTML 형식의 리포트를 작성하는 응용을 제시한다. 로그 필드는 Timestamp, ServerIP, Level, Message, ResponseTime으로 구성된다.

각 줄을 정제하고 쉼표로 나눈 뒤 ResponseTime을 숫자로 변환한다. 응답시간이 50초 이상이면 HTML 표 행의 배경을 주황색으로 지정하고, Level이 WARNING이면 글자색을 노란색으로 표시한다.

src = open("server_log.csv", "r", encoding="utf-8")
report = open("report.html", "w", encoding="utf-8")

report.write("<table>\n")
for line in src:
    timestamp, server_ip, level, message, response = line.strip().split(",")
    response_time = int(response)

    row_style = "background: orange;" if response_time >= 50 else ""
    level_style = "color: yellow;" if level == "WARNING" else ""

    report.write(f'<tr style="{row_style}">')
    report.write(f"<td>{timestamp}</td>")
    report.write(f"<td>{server_ip}</td>")
    report.write(f'<td style="{level_style}">{level}</td>')
    report.write(f"<td>{message}</td>")
    report.write(f"<td>{response_time}</td></tr>\n")

report.write("</table>")
src.close()
report.close()

이 예제는 파일 읽기와 쓰기, 줄 단위 반복, strip(), split(), 형 변환, 조건문과 문자열 형식화를 결합한다. 원시 로그 데이터를 사람이 쉽게 확인할 수 있는 정보 리포트로 바꾸는 파싱의 전체 흐름을 보여준다.

안전한 파싱

실제 데이터에서는 헤더 줄, 빈 줄, 필드 개수와 숫자 변환 가능 여부를 확인해야 한다. 강의록 예제의 핵심은 문자열 로그를 정제·분리·변환하여 조건에 맞게 표현하는 과정이다.

핵심 개념 정리

파일과 경로

파일은 비휘발성 보조기억장치에 저장된 데이터의 논리적 집합이다. 파일 시스템은 루트부터 이어지는 트리 구조이고 경로는 파일 위치를 나타낸다. 절대 경로는 루트부터, 상대 경로는 현재 작업 디렉터리부터 표현한다.

파일 표현

텍스트 파일은 문자 인코딩을 통해 저장하고 바이너리 파일은 형식별 이진 데이터를 저장한다. 파일은 연속된 바이트, 파일 포인터와 EOF로 이해할 수 있다. UTF-8 등 저장과 읽기의 인코딩을 맞춰야 한다.

파일 입출력

open-access-close 순서로 작업한다. r은 읽기, w는 기존 내용을 지우고 쓰기, a는 끝에 추가한다. read는 문자 범위, readline은 한 줄, readlines는 줄 리스트를 반환하며 write는 문자열을 기록한다.

파싱

파싱은 문자열을 읽고 정제·분리·변환하여 의미 있는 데이터로 만드는 과정이다. 대용량 파일은 줄 단위로 반복하고 strip으로 공백을 제거하며 split으로 필드를 나누어 메모리와 비교 오류를 줄인다.

최종 정리

파일 처리는 프로그램의 데이터를 실행 이후에도 보존하고 다른 프로그램과 교환하게 한다. 시험에서는 절대·상대 경로, 텍스트·바이너리 파일, 파일 모드, 파일 포인터, read 계열 메소드, w와 a의 차이, close의 필요성, strip·split과 줄 단위 파싱을 정확히 구분해야 한다.

예상문제 20선

1. 데이터의 영속성에 대한 설명으로 옳은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
영속성은 프로그램과 전원이 종료되어도 보조기억장치에 데이터가 계속 보존되는 특성이다.

2. 파일 시스템에서 경로(path)의 의미는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
경로는 계층적 파일 시스템에서 파일 또는 디렉터리가 어디에 있는지를 표현한다.

3. 상대 경로의 기준은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
상대 경로는 현재 작업 디렉터리를 기준으로 목표 파일의 위치를 나타낸다.

4. 상위 디렉터리를 나타내는 기호는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
점 하나는 현재 디렉터리, 점 두 개는 부모인 상위 디렉터리를 의미한다.

5. 텍스트 파일의 특징은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
텍스트 파일은 문자를 ASCII, UTF-8 같은 인코딩 방식으로 비트열에 대응하여 저장한다.

6. 세계 여러 문자를 표현하는 국제 표준으로 널리 쓰이는 인코딩은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
UTF-8은 유니코드 기반 가변길이 인코딩으로 세계 여러 문자를 표현한다.

7. 파일 입출력의 올바른 기본 순서는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
파일을 열어 객체와 권한을 얻고 읽기·쓰기를 수행한 뒤 자원을 반환하도록 닫는다.

8. 기존 파일 내용을 모두 지우고 새로 기록하는 모드는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
w 모드는 쓰기용으로 열며 기존 파일이 있으면 내용을 삭제하고 처음부터 기록한다.

9. 기존 데이터를 보존하면서 파일 끝에 추가하는 모드는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
append를 뜻하는 a 모드는 파일 포인터를 끝으로 옮겨 기존 내용 뒤에 기록한다.

10. read(6)을 호출한 뒤 read()를 호출하면 두 번째 호출은 무엇을 읽는가?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
첫 호출로 포인터가 6문자 뒤로 이동했으므로 다음 read()는 남은 내용을 읽는다.

11. readlines()의 반환값은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
readlines()는 파일의 여러 라인을 읽어 문자열 리스트로 반환한다.

12. write()에 대한 설명으로 옳은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
write()는 문자열을 기록하고 줄바꿈을 자동 추가하지 않으므로 \n을 직접 포함해야 한다.

13. close()가 필요한 이유는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
close()는 남은 데이터를 저장하고 운영체제 자원을 반환하여 무결성과 자원 관리를 돕는다.

14. 데이터 파싱의 기본 순서로 가장 적절한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
원시 문자열을 읽고 불필요 문자를 정제한 뒤 필드로 분리하고 적절한 자료형으로 변환한다.

15. 대용량 파일을 메모리 효율적으로 처리하는 방법은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
줄 단위 반복은 전체 파일을 메모리에 올리지 않아 GB 규모 파일 처리에 유리하다.

16. strip()의 주요 기능은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
strip()은 문자열 양 끝의 불필요한 공백류 문자를 제거해 비교와 파싱 오류를 줄인다.

17. line.split(",")의 결과는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
split(",")은 쉼표가 나타날 때마다 문자열을 분리하여 각 필드를 리스트 원소로 만든다.

18. 서버 로그 리포트 예제에서 응답시간 50 이상에 적용하는 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
응답시간이 50 이상이면 해당 HTML 표 행의 배경색을 주황색으로 변경한다.

19. 로그의 Level이 WARNING일 때 적용하는 표시 조건은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
강의록의 요구사항은 WARNING 레벨을 노란색 글자로 강조하는 것이다.

20. 명언 파일 끝에 저자를 추가할 때 적합한 모드는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
기존 명언을 유지한 채 마지막에 저자만 붙이려면 append 모드인 a를 사용한다.

댓글