방송대 파이썬프로그래밍기초 12강: 파일 모드와 데이터 파싱
파일을 다루는 코드는 문법 한 줄보다 선택이 중요합니다. 같은 파일도 경로·모드·인코딩·읽기 방법을 어떻게 정하느냐에 따라 정상적으로 읽히거나, 기존 내용이 사라지거나, 큰 파일에서 메모리가 부족해질 수 있습니다. 파일의 위치를 찾는 단계부터 포인터의 이동, 줄 단위 파싱까지 하나의 판단 흐름으로 연결합니다.
파일 작업은 네 가지 결정을 먼저 내려야 한다
서버 로그를 읽어 응답 시간이 긴 행을 찾는다고 하자. 곧바로 open()부터 쓰면 파일을 못 찾거나 한글이 깨지고, 읽어야 할 파일을 덮어쓰는 실수가 생길 수 있다. 먼저 어디에 있는가, 무엇을 할 것인가, 문자를 어떻게 해석할 것인가, 얼마나 나누어 읽을 것인가를 정해야 한다.
| 결정 | 확인할 질문 | 대표 선택 | 잘못 선택했을 때 |
|---|---|---|---|
| 경로 | 현재 작업 디렉터리를 기준으로 찾을 것인가? | 절대 경로, 상대 경로 | 파일을 찾지 못함 |
| 모드 | 읽기·새로 쓰기·이어 쓰기 중 무엇인가? | r, w, a | 기존 내용 삭제 또는 잘못된 위치에 기록 |
| 인코딩 | 바이트를 어떤 문자 규칙으로 해석할 것인가? | utf-8, 필요 시 다른 인코딩 | 문자 깨짐 또는 디코딩 오류 |
| 읽기 단위 | 전체·문자 수·한 줄·줄 목록 중 무엇이 필요한가? | read(), readline(), 반복 | 불필요한 메모리 사용 또는 처리 누락 |
파일 작업 계약: 경로·모드·인코딩·읽기 단위를 코드보다 먼저 한 문장으로 적는다. 예를 들어 “현재 폴더의 UTF-8 서버 로그를 읽기 모드로 열어 한 줄씩 처리한다”라고 정하면 필요한 코드 선택이 거의 결정된다.
파일은 휘발성 메모리 밖에 데이터를 남기는 논리 단위다
프로그램이 실행되는 동안 변수는 주기억장치에서 빠르게 사용되지만, 실행이 끝나면 그 상태를 그대로 보존할 수 없다. 영속성은 프로그램이 종료된 뒤에도 데이터가 유지되는 성질이다. 하드디스크, SSD, USB 메모리 같은 보조기억장치는 전원이 꺼져도 기록을 보존하고, 운영체제는 그 저장 공간을 파일 시스템으로 조직한다.
파일은 보조기억장치에 저장된 논리적인 데이터 모음이다. 파일명은 대상을 식별하고, .txt, .py, .csv 같은 확장자는 일반적으로 내용의 형식이나 용도를 짐작하게 한다. 다만 확장자만 바꾼다고 내부 데이터 형식까지 바뀌는 것은 아니다.
파일 시스템은 루트에서 디렉터리와 파일이 갈라지는 계층 구조다. 디렉터리 또는 폴더는 다른 디렉터리와 파일을 담는 컨테이너이고, 경로는 그 트리에서 특정 파일의 위치를 가리키는 주소다.
영속성의 경계: 파일에 저장했다고 해서 올바른 결과가 자동으로 보장되지는 않는다. 쓰기 모드 선택, 저장 완료 전 종료, 잘못된 인코딩처럼 기록 과정이 틀리면 오류도 그대로 남는다. 영속성은 보존의 성질이지 정확성의 보증이 아니다.
절대 경로와 상대 경로는 출발점이 다르다
절대 경로는 루트부터 파일까지의 전체 위치를 나타낸다. 유닉스 계열의 /var/etc/python.py처럼 시작점이 고정되므로 현재 작업 위치가 달라져도 같은 대상을 가리킨다. 반면 상대 경로는 현재 작업 디렉터리를 출발점으로 삼는다. .은 현재 디렉터리, ..은 상위 디렉터리를 뜻하므로 ../etc/python.py는 현재 위치의 부모 폴더로 올라간 뒤 etc에서 파일을 찾는다.
| 상황 | 적합한 경로 | 이유 |
|---|---|---|
| 파일 위치가 시스템에서 고정됨 | 절대 경로 | 실행 위치와 무관하게 같은 위치를 명시 |
| 프로젝트 폴더 전체를 함께 이동함 | 상대 경로 | 프로젝트 내부의 관계가 유지되면 경로도 유지 |
| 상위 폴더의 자료를 참조함 | ../자료/파일명 | ..으로 부모 디렉터리를 기준 삼음 |
상대 경로 오류를 분석할 때는 “코드 파일이 어디에 있는가”보다 “프로그램의 현재 작업 디렉터리가 어디인가”를 먼저 확인한다. 두 위치는 항상 같다고 보장할 수 없기 때문이다.
텍스트 파일도 저장 장치에서는 바이트의 연속이다
파일의 물리적 표현은 바이트의 연속이다. 텍스트 파일은 그 바이트를 문자 인코딩 규칙에 따라 사람이 읽을 수 있는 문자열로 해석한다. 바이너리 파일은 이미지, 실행 파일처럼 텍스트만으로 의미를 읽기 어려운 데이터를 담으며, 형식에 맞는 프로그램이나 처리 규칙이 필요하다.
| 인코딩 | 핵심 특징 | 판단 포인트 |
|---|---|---|
| ASCII | 7비트로 영문자·숫자·기본 기호 표현 | 한글과 세계 여러 문자를 직접 표현하기 어려움 |
| EUC-KR·CP949 | 한글 문서와 과거 Windows 환경에서 사용 | 다른 환경과 교환할 때 호환성 확인 필요 |
| UTF-8 | 유니코드 문자를 가변 길이 바이트로 표현 | 여러 언어를 함께 다루는 일반적인 선택 |
읽을 때 지정한 인코딩은 파일을 저장할 때 사용한 인코딩과 맞아야 한다. 같은 바이트라도 다른 규칙으로 해석하면 문자가 깨지거나 오류가 난다. 따라서 “한글 파일이니 무조건 특정 인코딩”이라고 추측하기보다 파일을 만든 프로그램과 저장 설정을 확인해야 한다.
open()은 파일과 프로그램 사이의 스트림을 만든다
파일 사용은 열기 → 접근 → 닫기의 세 단계로 진행된다. 열기 단계에서 운영체제의 접근 권한을 얻고 파일 객체와 데이터 통로인 스트림을 만든다. 접근 단계에서는 파일 객체의 메서드로 읽거나 쓴다. 닫기 단계에서는 사용한 자원을 반환하고 버퍼에 남은 데이터를 반영한다.
job_file = open("Jobs.txt", "r", encoding="utf-8")
contents = job_file.read()
job_file.close()
open(파일명, 모드, encoding=인코딩)의 형태로 읽는다. 여기서 인코딩은 encoding="utf-8"처럼 키워드 인자로 적어 의미를 분명히 한다. 파이썬의 세 번째 위치 인자는 인코딩 자리가 아니므로 open("Jobs.txt", "r", "utf-8")처럼 쓰면 안 된다.
닫기가 필요한 이유: 파일 객체를 닫아야 운영체제 자원이 반환되고, 쓰기 데이터가 안전하게 반영된다. 열기에는 성공했지만 이후 처리에서 문제가 생길 수 있다는 점까지 고려해 닫기 단계를 작업 설계에 포함한다.
모드는 기존 데이터를 어떻게 취급할지 결정한다
| 모드 | 목적 | 처음 포인터 위치 | 파일이 이미 있을 때 | 파일이 없을 때 |
|---|---|---|---|---|
r | 읽기 | 파일 시작 | 기존 내용 읽기 | 열기 실패 |
w | 새로 쓰기 | 파일 시작 | 기존 내용을 지우고 시작 | 새 파일 생성 |
a | 이어 쓰기 | 파일 끝 | 기존 내용 뒤에 추가 | 새 파일 생성 |
output_file = open("python.txt", "w", encoding="utf-8")
output_file.write("첫 번째 줄\n")
output_file.write("두 번째 줄\n")
output_file.close()
write()는 문자열을 현재 포인터 위치에 기록하고 줄바꿈을 자동으로 넣지 않는다. 다음 줄로 넘기려면 \n을 직접 포함한다. 특히 w는 파일이 존재하면 내용을 비우고 새로 쓰므로 “조금만 덧붙이기”에는 사용할 수 없다.
quote_file = open("Khan.txt", "a", encoding="utf-8")
quote_file.write("\n-칭기스 칸-")
quote_file.close()
기존 문장 뒤에 출처를 보존하며 추가하려면 a를 선택한다. 단, 원래 파일의 마지막에 줄바꿈이 있는지 모르면 추가 문자열 앞의 \n 때문에 빈 줄이 생기거나, 반대로 줄바꿈을 생략해 두 내용이 붙을 수 있다. 기록할 경계를 먼저 확인해야 한다.
파일 포인터를 추적하면 연속 읽기의 결과가 보인다
파일 객체에는 다음 읽기 또는 쓰기가 시작될 위치를 가리키는 파일 포인터가 있다. 읽기가 끝날 때마다 포인터는 소비한 만큼 뒤로 이동한다. 파일 끝인 EOF에 도달하면 더 읽을 내용이 없다.
sample_file = open("sample.txt", "r", encoding="utf-8")
first_six = sample_file.read(6)
remaining = sample_file.read()
sample_file.close()
print(repr(first_six))
print(repr(remaining))
파일 내용이 Python file\nsecond라면 첫 출력은 'Python', 두 번째 출력은 ' file\nsecond'다. 두 번째 read()가 처음부터 다시 읽지 않는 이유는 첫 호출 뒤 포인터가 일곱 번째 문자 앞에 있기 때문이다.
- 열기 직후 포인터는 파일 시작에 있다.
read(6)이 문자 여섯 개를 반환하고 포인터를 그 뒤로 옮긴다.- 인자 없는
read()가 현재 위치부터 EOF까지 반환한다. - EOF에서 다시 읽으면 남은 내용이 없으므로 빈 문자열이 나온다.
자가 추적법: 파일 내용을 한 줄로 적고 현재 포인터 앞에 | 표시를 둔다. 메서드를 한 번 호출할 때마다 반환한 범위를 괄호로 묶고 |를 다음 위치로 이동하면 연속 읽기 문제를 계산할 수 있다.
읽기 메서드는 결과 모양과 파일 크기로 고른다
| 방법 | 반환 결과 | 적합한 상황 | 주의점 |
|---|---|---|---|
read(n) | 현재 위치부터 최대 n문자의 문자열 | 고정 길이 머리글 등 일부만 필요 | 호출할 때마다 포인터 이동 |
read() | 현재 위치부터 끝까지 하나의 문자열 | 작은 파일 전체가 필요 | 큰 파일은 메모리 부담 |
readline() | 현재 위치부터 한 줄의 문자열 | 한 줄씩 호출하며 제어 | 줄바꿈 문자가 포함될 수 있음 |
readlines() | 모든 줄을 원소로 가진 리스트 | 작은 파일의 줄 목록이 필요 | 전체를 리스트로 올림 |
for line in file | 반복할 때마다 한 줄 | 큰 로그를 순차 처리 | 각 줄의 정제·변환을 반복문 안에서 수행 |
log_file = open("server.csv", "r", encoding="utf-8")
for line in log_file:
clean_line = line.strip()
fields = clean_line.split(",")
print(fields)
log_file.close()
기가바이트급 파일을 read()나 readlines()로 한꺼번에 읽으면 파일 전체와 처리 중간값이 메모리를 차지할 수 있다. 모든 줄을 동시에 보관할 이유가 없다면 파일 객체를 직접 반복해 한 줄씩 처리하는 편이 효율적이다.
파싱은 문자열을 의미 있는 데이터로 바꾸는 네 단계다
파일에서 읽은 값은 우선 문자열이다. 파싱은 문자열을 정해진 문법이나 구분 규칙에 따라 나누어 의미 있는 단위로 바꾸는 과정이다. 서버 로그 한 줄을 날짜, 서버 IP, 로그 수준, 메시지, 응답 시간으로 사용하려면 읽기만으로는 부족하다.
line = "2026-06-01,10.0.0.51,WARN,Logout,60\n"
clean_line = line.strip()
fields = clean_line.split(",")
response_time = int(fields[4])
if fields[2] == "WARN" or response_time >= 50:
print(fields)
- 읽기: 파일에서 한 줄을 문자열로 가져온다.
- 정제:
strip()으로 양끝의 줄바꿈·공백·탭을 제거한다. - 분리:
split(",")으로 쉼표 기준 필드 목록을 만든다. - 변환: 응답 시간처럼 계산할 값은
int()로 숫자로 바꾼다.
strip()을 생략하면 마지막 필드에 \n이 남아 문자열 비교가 빗나갈 수 있다. 반대로 split()만 했다고 숫자 계산이 가능한 것은 아니다. "60"은 숫자 60이 아니라 문자열이므로 임계값과 비교하기 전에 변환해야 한다.
파싱 파이프라인: 읽기 → 정제 → 분리 → 형 변환 → 조건 판단의 순서를 지킨다. 오류가 나면 어느 단계의 입력 모양이 예상과 달랐는지 바로 확인할 수 있다.
서버 로그 보고서는 입력과 출력을 분리해 설계한다
강의자료의 서버 로그 사례는 CSV 형식의 원본을 읽고 HTML 보고서를 만드는 문제다. 입력 파일에는 시간, 서버 IP, 로그 수준, 메시지, 응답 시간이 있고, 출력에서는 응답 시간이 50 이상인 값이나 WARN 행을 눈에 띄게 표시한다. 핵심은 HTML 문자열을 먼저 쓰는 것이 아니라 판정 가능한 데이터로 변환하는 것이다.
| 단계 | 입력 | 처리 | 출력 |
|---|---|---|---|
| 수집 | 로그 파일 한 줄 | 줄 단위 읽기 | 원시 문자열 |
| 구조화 | 원시 문자열 | strip(), split(",") | 필드 목록 |
| 타입 변환 | 응답 시간 문자열 | int() | 비교 가능한 정수 |
| 판정 | 수준·응답 시간 | WARN 여부, 50 이상 여부 검사 | 강조 규칙 |
| 표현 | 필드와 강조 규칙 | 표의 행 구성 | HTML 보고서 |
입력 파일은 r, 새 보고서는 w가 자연스럽다. 매 실행마다 같은 보고서를 다시 만드는 목적이라면 이전 출력이 남아 있는 a보다 새로 쓰기가 맞다. 반대로 원본 로그에 새 기록을 보태는 작업이라면 a를 검토한다. 모드는 파일 이름이 아니라 작업 의도로 결정한다.
경계 사례: 단순한 split(",")은 메시지 자체에 쉼표가 포함된 복잡한 CSV를 정확히 해석하지 못할 수 있다. 이 강의의 단순 예제에서는 필드 내부에 쉼표가 없다는 전제가 필요하다. 파싱 규칙을 사용할 때는 데이터가 그 전제를 지키는지 먼저 확인한다.
오류는 경로·열기·읽기·해석·닫기 순서로 찾는다
- 경로 확인: 절대·상대 경로와 현재 작업 디렉터리의 관계를 확인한다.
- 열기 조건 확인: 읽기·새로 쓰기·이어 쓰기 중 의도한 모드인지, 인코딩이 저장 규칙과 맞는지 본다.
- 포인터 확인: 앞선 읽기나 쓰기 뒤 현재 위치가 어디인지 표시한다.
- 결과 모양 확인: 문자열 하나, 한 줄, 줄 목록 가운데 메서드가 반환한 형태를 확인한다.
- 파싱 전제 확인: 줄바꿈 제거, 구분자, 필드 수와 숫자 변환이 데이터 형식에 맞는지 본다.
- 닫기 확인: 작업 종료 후 파일 객체를 닫아 자원과 출력 데이터를 정리한다.
예를 들어 “응답 시간 100이 50보다 작다고 판정된다”면 파일 열기보다 형 변환을 의심해야 한다. 두 값을 문자열로 비교하면 숫자의 크기가 아니라 문자 순서로 비교될 수 있다. 반대로 첫 줄은 읽히는데 다음 호출에서 빈 문자열이 나온다면 데이터 형식보다 포인터가 이미 EOF에 도달했는지 확인한다.
핵심 개념 정리
- 파일은 프로그램 종료 뒤에도 데이터를 남기기 위한 보조기억장치의 논리 단위다.
- 절대 경로는 루트, 상대 경로는 현재 작업 디렉터리를 출발점으로 삼는다.
- 텍스트 파일도 바이트로 저장되며, 읽을 때의 인코딩은 저장할 때의 규칙과 맞아야 한다.
- 파일 사용은 열기·접근·닫기의 흐름이며, 닫기는 자원 반환과 데이터 반영에 필요하다.
r은 읽기,w는 기존 내용을 비우고 새로 쓰기,a는 파일 끝에 이어 쓰기다.- 파일 포인터는 다음 작업 위치를 가리키며 읽거나 쓸 때 이동한다.
- 읽기 방법은 필요한 결과 모양과 파일 크기를 함께 고려해 선택한다.
- 파싱은 읽기·정제·분리·형 변환·조건 판단으로 이어지는 과정이다.
파일 문제를 만나면 먼저 경로로 대상을 확정하고, 작업 의도에 맞는 모드와 저장 규칙에 맞는 인코딩을 고른다. 이어서 파일 크기와 필요한 결과 형태에 따라 읽기 단위를 정하고, 매 호출 뒤 포인터 위치를 추적한다. 마지막으로 문자열을 정제·분리·변환해 의미 있는 값으로 판정한 뒤 파일을 닫는다. 이 순서는 단순 텍스트 읽기부터 로그 보고서 생성까지 반복해서 적용할 수 있다.
예상문제 10선
1. 파일의 영속성을 가장 정확하게 설명한 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
- ① 오답: 접근 속도가 아니라 실행 종료 뒤의 보존 여부가 핵심이다.
- ② 정답: 보조기억장치의 파일을 사용해 데이터가 실행 시간의 경계를 넘어 유지된다.
- ③ 오답: 확장자 변경만으로 데이터의 실제 인코딩이나 구조는 바뀌지 않는다.
- ④ 오답: 프로그램이 필요한 데이터를 파일에 명시적으로 기록해야 한다.
2. 절대 경로와 상대 경로를 바르게 비교한 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
- ① 정답: 두 경로를 구분하는 출발점을 정확히 설명한다.
- ② 오답: 루트부터 적는 쪽은 절대 경로다.
- ③ 오답:
..은 현재 디렉터리의 부모 디렉터리를 뜻한다. - ④ 오답: 상대 경로는 현재 작업 디렉터리가 바뀌면 다른 대상을 가리킬 수 있다.
3. 기존 Khan.txt의 문장을 보존하면서 맨 뒤에 출처를 추가하려면 가장 알맞은 모드는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
- ① 오답: 읽기 모드에서는 문자열을 추가하는 목적을 수행할 수 없다.
- ② 오답: 새로 쓰기 모드는 기존 내용을 비우므로 보존 조건에 어긋난다.
- ③ 정답: 이어 쓰기 모드는 포인터를 파일 끝에 두고 기존 내용 뒤에 기록한다.
- ④ 오답:
write()는 열린 파일 객체의 메서드이므로 파일 객체가 필요하다.
4. 내용이 Python file인 파일에서 read(6) 뒤 read()를 호출한 결과는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
- ① 오답: 두 번째 읽기는 포인터가 이동한 현재 위치부터 시작한다.
- ② 정답: 여섯 문자를 읽은 뒤 포인터가 공백 앞에 있어 나머지
file을 반환한다. - ③ 오답:
read(6)은 최대 여섯 문자만 반환한다. - ④ 오답: 첫 호출 시 포인터가 파일 시작에 있으므로 읽을 내용이 있다.
5. 다음 코드가 인코딩을 지정하는 올바른 방법이 아닌 이유는?
open("Jobs.txt", "r", "utf-8")
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
- ① 오답: 텍스트 읽기 모드에서도 인코딩을 지정할 수 있다.
- ② 오답: UTF-8은 텍스트 문자를 바이트와 대응시키는 인코딩이다.
- ③ 오답: 파일명과 모드는 앞의 위치 인자로 사용할 수 있다.
- ④ 정답:
open("Jobs.txt", "r", encoding="utf-8")처럼 의미가 맞는 키워드 인자를 사용한다.
6. 매우 큰 로그 파일을 모든 줄을 저장하지 않고 검사할 때 가장 적절한 방법은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
- ① 오답: 파일 전체가 한꺼번에 메모리를 차지한다.
- ② 오답: 모든 줄을 리스트로 만들므로 전체 저장을 피한다는 조건에 맞지 않는다.
- ③ 정답: 반복할 때마다 한 줄을 처리하므로 전체 내용을 동시에 보관할 필요가 없다.
- ④ 오답: 새로 쓰기 모드는 검사할 원본 내용을 삭제한다.
7. 로그 한 줄을 조건 판정에 사용할 데이터로 만드는 순서로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
- ① 오답: 읽기 전에는 변환할 문자열이 없고 닫은 뒤에는 계속 읽을 수 없다.
- ② 오답: 판정에 필요한 데이터를 만들기 전에 조건을 검사할 수 없다.
- ③ 정답: 원시 문자열에서 불필요한 문자를 제거하고 필드를 나눈 뒤 필요한 타입으로 바꿔 판정한다.
- ④ 오답: 데이터를 읽기 전에 분리할 수 없으며 새로 쓰기는 파싱 단계가 아니다.
8. "2026-06-01,10.0.0.51,WARN,Logout,60\n"에서 응답 시간 60을 정수로 얻는 식은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
- ① 정답: 줄바꿈을 제거하고 쉼표로 나눈 다섯 번째 필드를 정수로 변환한다.
- ② 오답:
line은 문자열이며 파일 객체의read()메서드를 사용할 대상이 아니다. - ③ 오답: WARN 앞부분을 나눌 뿐 응답 시간 필드를 선택하거나 정수로 바꾸지 않는다.
- ④ 오답: 문자열에는 파일 기록용
write()메서드가 없고 기존 데이터에서 값을 추출하지도 않는다.
9. 파일 객체를 닫아야 하는 이유로 가장 적절한 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
- ① 오답: 닫기와 파일명·확장자 변경은 관계가 없다.
- ② 정답: 열린 파일이 사용하던 자원을 정리하고 버퍼의 기록을 반영하는 단계다.
- ③ 오답: 닫기는 포인터 재사용을 위한 이동 명령이 아니다.
- ④ 오답: 파일 형식 변환은 닫기의 기능이 아니다.
10. 큰 UTF-8 서버 로그를 읽어 매번 새로운 HTML 보고서를 만드는 설계로 가장 적절한 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
- ① 오답: 입력 로그를 새로 쓰기 모드로 열면 분석할 원본이 삭제된다.
- ② 오답: 인코딩 불일치 위험이 있고 큰 파일 전체를 리스트로 보관할 필요가 없다.
- ③ 오답: 보고서가 실행마다 누적되고 문자열 상태의 응답 시간은 수치 판정에 적합하지 않다.
- ④ 정답: 원본 보존, 올바른 문자 해석, 메모리 효율과 새 보고서 생성 목적을 모두 만족한다.
참고 자료와 작성 기준
이 글은 해당 차시 강의자료를 바탕으로 학습 목적에 맞게 재구성한 비공식 학습자료입니다. 파일 모드 선택표, 포인터 추적, 파싱 파이프라인, 오류 진단 절차와 문제 해설은 학습자의 이해와 적용을 돕도록 구성하고 검토했습니다.
- 작성·편집: 올에이클래스 학습연구팀
- 주요 근거: 한국방송통신대학교 컴퓨터과학과 「파이썬프로그래밍기초」 강의록 12강 「파일」, 1~24쪽
- 범위 구분: 25쪽의 13강 「실전 프로젝트 I」 예고는 본문에서 제외
- 보충 자료: 외부 자료를 사용하지 않음
- 편집 원칙: 올에이클래스 편집 정책
- 최종 내용 검토: 2026-09-08
댓글
댓글 쓰기