이번에는 파일처리 함수와, 제네레이터가 무엇인지에 대해 소개하겠다.
파일 처리
파일과 관련된 처리를 하는 함수는 표준 함수가 기본으로 제공된다.
파일은 크게 텍스트 파일과 바이너리 파일로 나뉘는데, 오늘은 텍스트 파일에 관련된 내용만 살펴보겠다.
파일을 처리하려면 일단 파일 열기를 해야한다. 파일을 열면 파일 읽기 또는 파일 쓰기를 할 수있다.
파일 열고 닫기
파일을 열 때는 open() 함수를 사용한다.
파일 객체 = open(문자열:파일 경로, 문자열: 읽기모드)
open 함수는 이런 형식으로 사용한다. 첫번째 매개변수에는 파일 경로를 입력하고, 두번째 매개변수에는 모드를 지정한다.
모드는 w,a,r 세가지 모드가 존재한다.
Mode | 설명 |
w | write모드(새로 쓰기 모드) |
a | append모드(뒤에 이어서 쓰기 모드) |
r | read모드(읽기 모드) |
파일을 닫을 때는 close() 함수를 사용한다.
# 파일 열고 닫기
# 파일에 텍스트를 씁니다.
file = open("basic.txt", "w")
file.write("Hello Python Programming!")
# 파일을 닫습니다.
file.close()
프로그램을 실행하면 프로그램과 같은 폴더에 basic.txt가 생성이 된다.
열어보면이번에는 파일처리 함수와, 제네레이터가 무엇인지에 대해 소개하겠다.
파일 처리
파일과 관련된 처리를 하는 함수는 표준 함수가 기본으로 제공된다.
파일은 크게 텍스트 파일과 바이너리 파일로 나뉘는데, 오늘은 텍스트 파일에 관련된 내용만 살펴보겠다.
파일을 처리하려면 일단 파일 열기를 해야한다. 파일을 열면 파일 읽기 또는 파일 쓰기를 할 수있다.
파일 열고 닫기
파일을 열 때는 open() 함수를 사용한다.
파일 객체 = open(문자열:파일 경로, 문자열: 읽기모드)
open 함수는 이런 형식으로 사용한다. 첫번째 매개변수에는 파일 경로를 입력하고, 두번째 매개변수에는 모드를 지정한다.
모드는 w,a,r 세가지 모드가 존재한다.
w write모드(새로 쓰기 모드)
a append모드(뒤에 이어서 쓰기 모드)
r read모드(읽기 모드)
파일을 닫을 때는 close() 함수를 사용한다.
# 파일 열고 닫기
# 파일에 텍스트를 씁니다.
file = open("basic.txt", "w")
file.write("Hello Python Programming!")
# 파일을 닫습니다.
file.close()
프로그램을 실행하면 프로그램과 같은 폴더에 basic.txt가 생성이 된다.
열어보면
이렇게 txt 파일에 문구가 저장이 된다.
open() 함수로 파일을 열었으면 close() 함수로 꼭 닫아줘야 한다.
with 키워드
하지만 닫으라고 그렇게 말해도 안닫는 사람들이 존재하기에(나도 그럼 ㅎ)
아주 친절하게 파이썬에선 with 키워드로 open 함수를 사용하면 자동으로 close() 함수를 사용해주는 기능을 제공한다.
위 키워드는 read() 함수를 사용해보며 설명하겠다.
텍스트 읽기
파일을 읽을 때는 read() 함수를 사용한다.
# read() 함수로 텍스트 읽기
with open("basic.txt","r") as file :
contents = file.read()
print(contents)
파일을 열고 파일 객체의 read() 함수를 호출하기만 하면 내부에 있는 데이터를 모두 읽어 출력한다.
텍스트 한 줄씩 읽기
텍스트를 사용해 데이터를 구조적으로 표현할 수 있는 방법으로 CSV, XML, JSON 등이 있다.
이 중에서 CSV 를 간단하게 살펴보자. CVS는 Comma Separated Values의 줄임말로, 쉼표로 구분된 값들을 의미한다.
이름, 키, 몸무게
가나다, 180, 65
라마바, 165, 76
위와 같은 형식으로 이루어진 데이터가 CVS 이다.
CVS 파일은 한 줄에 하나의 데이터를 나타내며, 각각의 줄은 쉼표를 사용해 데이터를 구분한다.
이때 첫번째 줄에 헤더를 넣어 각 데이터가 무엇인지를 나타내는지 설명해 줄 수 있다.
최근에 기계학습(머신러닝)등에는 이러한 형태로 데이터를 저장하고 활용하는 경우가 많다고 한다.
나중에 머신러닝을 다룰때 보겠구만..
CVS 데이터를 가진 파일을 생성해보자.
# 랜덤하게 10명의 키와 몸무게 만들기
# 랜덤한 숫자를 만들기 위해 가져온다.
import random
hanguls = list("가나다라마바사아자차카타파하")
with open("info.txt", "w") as file :
for i in range(10) :
name = random.choice(hanguls) + random.choice(hanguls)
weigth = random.randrange(40, 100)
heigth = random.randrange(140, 200)
# 텍스트를 씁니다.
file.write("{}, {}, {}\n".format(name, weigth, heigth))
교재에서는 1000명을 랜덤하게 추출했지만, 나는 10명으로 해보겠다.
다음 코드는 10명의 이름, 키, 몸무게 데이터를 만들고, 텍스트로 파일에 작성한다.
이렇게 info.txt 에 10명의 데이터가 작성이 됐다.
이제 이 데이터를 한 줄씩 읽어들이고, 내친김에 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()
위 코드를 하나씩 보자.
먼저 파일을 open() 함수로 열었고, for 문을 돌며 하나씩 체크하고 있다.
만일 파일 데이터에 문제가 있을 경우, 그 데이터를 무시하고 다음으로 넘어가게 된다.
bmi를 계산하고, 출력을 하게 되는 모습을 볼 수 있다.
이번꺼는 생각보다 재밌었다 ㅎ
제너레이터
제너레이터는 파이썬의 특수한 문법 구조이다. 이터레이터를 직접 만들 때 사용하는 코드이다.
함수 내부에 yield 키워드를 사용하면 해당 함수는 제네레이터 함수가 되며, 일반 함수와는 달리 함수를 호출해도 함수 내부의 코드가 실행되지 않는다.
def test() :
print("함수가 호출되었습니다.")
yield "test"
print("A지점 통과")
test()
print("B지점 통과")
test()
print(test())
원래 test() 함수를 호출하면 함수가 호출되었습니다. 라는 문자열이 출력되어야 하지만, 출력되지 않는다.
함수의 리턴값으로 제너레이터 값이 호출이 될 뿐이다. 즉, 제너레이터 함수는 체너레이터를 리턴한다. 출력된 값은 제너레이터 객체이다.
제너레이터 객체는 next() 함수를 사용해 함수 내부의 코드를 실행한다.
이때 yield 키워드 부분 까지만 실행하며, next() 함수의 리턴값으로 yield 키워드 뒤에 입력한 값이 출력된다.
# 제네레이터 객체와 next() 함수
def test() :
print("A 지점 통과")
yield 1
print("B 지점 통과")
yield 2
print("C 지점 통과")
output = test()
print("D 지점 통과")
a = next(output)
print(a)
print("E 지점 통과")
b = next(output)
print(b)
print("F 지점 통과")
c = next(output)
print(c)
next(output)
코드를 실행하면 next() 함수를 호출할 때마다 "A 지점통과", 등등 함수 내부의 내용이 진행되는 모습을 확인 할 수 있다.
next() 함수를 호출한 이후 yield 키워드를 만나지 못하고 함수가 끝나면 StopIteration 이라는 예외가 발생한다.
이처럼 제너레이터 객체는 함수의 코드를 조금씩 실행할 때 사용한다. 이는 메모리의 효율성을 위해서이다.
정리
튜플은 리스트와 비슷하지만, 요소를 수정할 수 없는 파이썬의 특별한 문법이다. 괄호를 생략해서 다양하게 사용이 가능하다.
람다는 함수를 짧게 쓸 수 있는 파이썬의 특별한 문법이다.
with 구문은 블록을 벗어날 때 close() 함수를 자동으로 호출해 주는 구문이다.
'Programming > Python' 카테고리의 다른 글
17. 예외 고급 (0) | 2021.03.22 |
---|---|
16. 구문 오류와 예외 (0) | 2021.03.21 |
14. 함수 고급(람다, 튜플) (0) | 2021.03.20 |
13. 파이썬 - 함수의 활용 (0) | 2021.03.19 |
12. 함수 만들기 (0) | 2021.03.18 |
댓글