함수 고급(3) 파일 처리
파일 처리
파일과 관련된 처리를 하는 함수는 표준 함수가 기본으로 제공됨.
파일은 크게 텍스트 파일과 바이너리 파일로 나뉘는데, 여기선 '텍스트 파일'과 관련된 내용만 살펴봄
파일을 처리하려면 일단 파일 열기 open 를 해야 함.
파일을 열면 파일 읽기 read 또는 파일 쓰기 write 를 할 수 있음
파일 열고 닫기
파일을 열때는 open() 함수 사용
파일 객체 = open(문자열: 파일 경로, 문자열: 읽기 모드)
open() 함수의 첫 번째 매개변수에는 파일 경로path 를 입력하고, 두 번째 매개변수에는 모드mode 를 지정
모드에는 다음과 같은 것을 지정할 수 있음
모드 | 설명 |
w | write 모드(새로 쓰기 모드) |
a | append 모드(뒤에 이어서 쓰기 모드) |
r | read 모드(읽기 모드) |
파일을 닫을 때는 close() 함수 사용
파일객체.close()
파일을 열고 간단한 글을 써보는 예제
# 파일을 연다
file = open("basic.txt", "w")
# 파일에 텍스트 씀
file.write("Hello Python Programming...!")
# 파일 닫기
file.close()
프로그램을 실행하면 프로그램과 같은 폴더에 "basic.txt"라는 파일이 생성됨
이 파일을 메모장 등으로 열어보면 'Hello Python Programming...!' 이라고 쓰여있음을 확인할 수 있음
open() 함수로 파일을 열면, close() 함수로 파일을 닫아주어야 함. 프로그램이 종료될 때는 열려있는 파일을 모두 자동으로 닫고 종료됨.
반드시 open() 함수로 열면 close() 함수로 닫는 습관 만들기!
with 키워드
프로그램이 길어지면 open() 함수와 close() 함수 사이에 많은 코드가 들어감
조건문과 반복문이 들어가다 보면 파일을 열고 닫지 않는 실수를 하는 경우가 생길 수 있음.
이러한 실수를 방지하기 위해 with 키워드 라는 기능이 생김.
with open(문자열: 파일경로, 문자열: 모드) as 파일 객체:
문장
앞서 위의 코드를 with 구문으로 수정하면 밑과 같이 됨
# 파일을 연다
with open("basic.txt", "w") as file:
# 파일에 텍스트 씀
file.write("Hello Python Programming...!")
이렇게 코드를 작성하면 with 구문이 종료될 때 자동으로 파일이 닫힘. 따라서 파일을 열고 닫지 않는 실수를 줄일 수 있음
텍스트 읽기
파일에 텍스트를 쓸 때는 write() 함수를 사용.
반대로 파일을 읽을 때는 read() 함수를 사용.
파일 객체.read()
파일을 열고 파일 객체의 read() 함수를 호출하기만 하면 내부에 있는 데이터를 모두 읽어 출력함
read() 함수로 텍스트 읽기
# 파일을 연다
with open("basic.txt", "r") as file:
# 파일을 읽고 출력
contents = file.read()
print(contents)
</>
Hello Python Programming...!
텍스트 한 줄씩 읽기
텍스트를 사용해 데이터를 구조적으로 표현할 수 있는 방법으로 CSV, XML, JSON 등이 있음
이 중에서 CSV 를 간단히 살펴보면, CSV는 Comma Separated Values의 줄임말로 쉼표로 구분된 값들을 의미함
다음과 같은 데이터가 CSV 형식의 대표적 예
이름, 키, 몸무게
윤인성, 176, 62
연하진, 169, 50
CSV 파일은 한 줄에 하나의 데이터를 나타내며, 각각의 줄은 쉼표를 사용해 데이터를 구분함
이때 첫 번째 줄에 헤더header 를 넣어 각 데이터가 무엇을 나타내는지 설명해줄 수 있음.
최근 기계 학습 등에는 이러한 형태로 수십만 명의 데이터를 저장하고 활용하는 경우가 많음
하지만 한 번에 모든 데이터를 올려놓고 사용하는 것이 컴퓨터의 성능에 영향을 미칠 수 있음.
그러므로 한 번에 한 줄씩 읽어 들여 처리하는 방법을 살펴보자!
일단, 데이터를 구성함. 다음과 같이 간단한 코드로 1000명의 이름, 키, 몸무게 데이터를 만듦
랜덤하게 1000명의 키와 몸무게 만들기
# 랜덤한 숫자 만들기
import random
# 간단한 한글 리스트 만듦
hanguls = list("가나다라마바사아자차카타파하")
# 파일을 쓰기 모드로 엶
with open("info.txt", "w") as file:
for i in range(1000):
# 랜덤한 값으로 변수 설정
name = random.choice(hanguls) + random.choice(hanguls)
weight = random.randrange(40, 100)
height = random.randrange(140, 200)
# 텍스트를 씀
file.write("{}, {}, {}\n".format(name, weight, height))
그럼 데이터가 많이 있다고 가정하고 한 줄씩 읽어보자.
데이터를 한 줄씩 읽어 들일 때는 for 반복문을 다음과 같은 형태로 사용함
for 한 줄을 나타내는 문자열 in 파일 객체:
처리
이전에 만든 데이터를 한 줄씩 읽으면서 키와 몸무게로 BMI(비만도)를 계산.
with open("info.txt", "r") as file:
for line in file:
# 변수 선언
(name, weight, height) = line.strip().split(",")
#데이터가 문제 없는지 확인. 문제 없으면 지나감
if (not name) or (not weight) or (not height):
continue
# 결과 계산
bmi = int(weight) / (int(height) / 100) ** 2
result = ""
if 25 <= bmi:
result = "과체중"
elif 18.5 <= bmi:
result = "정상 체중"
else:
result = "저체중"
# 출력
print('\n'.join([
"이름: {}",
"몸무게: {}",
"키: {}",
"BMI: {}",
"결과: {}"
]).format(name, weight, height, bmi, result))
print()
</>
이름: 카가
몸무게: 70
키: 140
BMI: 35.71428571428572
결과: 과체중
이름: 아타
몸무게: 69
키: 141
BMI: 34.70650369699714
결과: 과체중
...