65 - (파이썬) CSV 파일 읽고 쓰기
텍스트를 사용해 데이터를 구조적으로 표현할 수 있는 방법으로는 CSV, XML, JSON🤍등이 있다.
# CSV
:(comma-separated values)는 몇 가지 필드를 쉼표(,)로 구분한 텍스트 데이터 및 텍스트 파일을 뜻한다.(인공지능 개발이나 데이터 분석에서 쓰이는 데이터 형식이 CSV이다.)
참고
XML(eXtensible Markup Language)은 데이터를 정의하는 규칙을 제공하는 마크업 언어입니다.
JSON(JavaScript Object Notation)은 Javascript 객체 문법으로 구조화된 데이터를 표현하기 위한 문자 기반의 표준 포맷입니다. 웹 어플리케이션에서 데이터를 전송할 때 일반적으로 사용합니다(서버에서 클라이언트로 데이터를 전송하여 표현하려거나 반대의 경우).
예시
이름, 몸무게, 키 | → 헤더(header) |
홍창기, 94, 189 | → 데이터 |
문성주, 80, 174 |
CSV파일은 한 중에 하나의 데이터를 나타내며 각각의 줄은 쉼표를 사용해 데이터를 구분한다. 첫 번째 줄에 헤더를 넣어 무엇을 나타내는 지 설명할 수도 있다.
# 랜덤하게 50인의 키와 몸무게, BMI 데이터를 만들어 보기
step 1) 랜덤하게 1명의 키와 몸무게 만들기
# 랜덤한 숫자를 만들기
import random
# 숫자 = random.randrange(시작, 끝)
weight = random.randrange(65, 120)
height = random.randrange(164, 194)
print(weight, height)
step 2) 랜덤하게 이름 만들기
#성으로 사용할 문자의 리스트를 만들고
lastname = list("김이박최정강조윤장임한오서신권황안송전홍유고문양손배조백허")
print(lastname)
#랜덤하게 하나 뽑아보면
print(random.choice(lastname))
>>>
['김', '이', '박', '최', '정', '강', '조', '윤', '장', '임', '한', '오', '서', '신', '권', '황', '안', '송', '전', '홍', '유', '고', '문', '양', '손', '배', '조', '백', '허']
문
#성과 이름의 리스트를 만들고
lastname = list("김이박최정강조윤장임한오서신권황안송전홍유고문양손배조백허")
name = list("이것은이름이되는문자를아무렇게나넣어보는리스트입니다뭐가나오려나")
#랜덤한 성과 이름을 뽑아내면
fn = random.choice(lastname)+random.choice(name)+random.choice(name)
print(fn)
>>>
정이이
step 3) 출력하는 방법_세 가지 모두 기억나니?
print(f"{fn},{weight},{height}")
print("{},{},{}".format(fn, weight, height))
print(",".join([fn, str(weight), str(height)]))
>>>
안입이,118,182
안입이,118,182
안입이,118,182
step 4) 헤더와 반복문까지 넣으면...
#성과 이름의 리스트
lastname = list("김이박최정강조윤장임한오서신권황안송전홍유고문양손배조백허")
name = list("이것은이름이되는문자를아무렇게나넣어보는리스트입니다뭐가나오려나")
# 랜덤한 숫자
import random
#헤더
print("이름, 몸무게, 키")
#반복문
for i in range(50):
fn = random.choice(lastname)+random.choice(name)+random.choice(name)
weight = random.randrange(65, 120)
height = random.randrange(164, 194)
print(f"{fn},{weight},{height}")
>>>
이름, 몸무게, 키
박름나,117,183
양오아,84,167
김가게,119,173
손를문,104,172
손나이,70,187
고이이,93,193
안나이,101,192
조렇이,98,187
고무리,96,186
서아려,71,179
윤되렇,70,178
박이리,72,181
유는나,115,170
안되트,104,176
윤나나,109,171
홍오이,65,165
허넣입,85,174
유아넣,103,178
허를가,68,178
김니이,106,172
송는나,73,180
강다나,109,188
강이이,90,179
유나이,88,192
송다는,94,183
한다나,76,179
양스오,66,181
박니를,108,166
배트이,112,175
허되렇,91,181
안니려,104,179
정리다,101,170
임되는,94,174
권이아,77,173
고니이,70,193
송아이,89,177
서트게,96,174
장를문,93,174
조려리,92,169
백는게,92,175
문이보,96,189
배어렇,116,185
신자나,71,189
배나스,100,185
고가은,71,179
손는무,81,174
권리를,75,174
문게렇,110,193
허이어,74,189
김오무,76,180
step 5) 파일로 만들기
: 열어서 작성할 파일을 만들고, 기존의 print로 작성한 부분은 파일.write로 바꾸고 줄바꿈 코드를 넣어주면
#성과 이름의 리스트
lastname = list("김이박최정강조윤장임한오서신권황안송전홍유고문양손배조백허")
name = list("이것은이름이되는문자를아무렇게나넣어보는리스트입니다뭐가나오려나")
# 랜덤한 숫자
import random
#파일 열기
yasun = open("bbplayer.txt","w")
#헤더
yasun.write("이름, 몸무게, 키\n")
#반복문
for i in range(50):
fn = random.choice(lastname)+random.choice(name)+random.choice(name)
weight = random.randrange(65, 120)
height = random.randrange(164, 194)
yasun.write(f"{fn},{weight},{height}\n")
#파일 닫기
yasun.close()
bbplayer.txt라는 파일이 생성되는 것을 볼 수 있다.
step 6) 그 파일을 꺼내기
bmifile = open("bbplayer.txt","r")
#한 줄씩 읽기 위해 반복문 사용, bmifile이라는 파일을 읽어서 line이라는 변수에 넣는다.
for line in bmifile:
print(line.strip())
#strip 없으면 print 함수가 개행을 한 번 더 먹여서 개행이 두 번 들어간다.
bmifile.close()
>>>
이름, 몸무게, 키
최넣아,111,171
이를문,74,184
서이아,116,179
임보나,111,173
장게려,114,165
박는이,108,181
윤나보,107,176
강는무,96,164
백아어,88,169
송보니,105,187
한문넣,118,187
정것어,113,169
배보입,80,178
배리입,89,184
안려넣,101,173
양은니,104,176
장는넣,87,179
유오리,97,193
안무입,68,167
조넣나,73,177
이는아,98,170
안스입,69,183
황아는,71,169
문스나,102,191
허어트,77,166
황려나,108,187
오렇리,86,165
박리넣,75,190
양다렇,73,165
장오를,69,172
신나나,75,170
양어니,107,189
손를입,108,176
고것무,66,179
홍보자,75,184
양문나,110,171
신무가,81,171
배어것,117,185
권름되,71,178
윤입이,112,169
최려는,80,177
한니이,94,191
문아이,113,166
윤이트,87,165
박를넣,115,176
최은를,96,192
임이이,114,186
권이어,115,181
손는오,89,171
양뭐이,65,188
step 7) split","으로 구분해주면 각각이 쉼표로 구분되서 리스트내부로 들어온다.
bmifile = open("bbplayer.txt","r")
#한 줄씩 읽기 위해 반복문 사용, bmifile이라는 파일을 읽어서 line이라는 변수에 넣는다.
for line in bmifile:
print(line.strip().split(","))
#strip 없으면 print 함수가 개행을 한 번 더 먹여서 개행이 두 번 들어간다.
bmifile.close()
['이름', ' 몸무게', ' 키']
['최넣아', '111', '171']
['이를문', '74', '184']
['서이아', '116', '179']
['임보나', '111', '173']
['장게려', '114', '165']
['박는이', '108', '181']
['윤나보', '107', '176']
['강는무', '96', '164']
['백아어', '88', '169']
['송보니', '105', '187']
['한문넣', '118', '187']
['정것어', '113', '169']
['배보입', '80', '178']
['배리입', '89', '184']
['안려넣', '101', '173']
['양은니', '104', '176']
['장는넣', '87', '179']
['유오리', '97', '193']
['안무입', '68', '167']
['조넣나', '73', '177']
['이는아', '98', '170']
['안스입', '69', '183']
['황아는', '71', '169']
['문스나', '102', '191']
['허어트', '77', '166']
['황려나', '108', '187']
['오렇리', '86', '165']
['박리넣', '75', '190']
['양다렇', '73', '165']
['장오를', '69', '172']
['신나나', '75', '170']
['양어니', '107', '189']
['손를입', '108', '176']
['고것무', '66', '179']
['홍보자', '75', '184']
['양문나', '110', '171']
['신무가', '81', '171']
['배어것', '117', '185']
['권름되', '71', '178']
['윤입이', '112', '169']
['최려는', '80', '177']
['한니이', '94', '191']
['문아이', '113', '166']
['윤이트', '87', '165']
['박를넣', '115', '176']
['최은를', '96', '192']
['임이이', '114', '186']
['권이어', '115', '181']
['손는오', '89', '171']
['양뭐이', '65', '188']
step 8) 숫자를 문자로 인식하지 못하도록 다중할당을 사용한다.
bmifile = open("bbplayer.txt","r")
for line in bmifile:
이름,몸무게,키 = line.strip().split(",")
#헤더에서 오류가 나지 않도록 하고
if not 몸무게.isdigit():
continue
몸무게 = int(몸무게)
키 = int(키)
print(이름,몸무게,키)
bmifile.close()
최넣아 111 171
이를문 74 184
서이아 116 179
임보나 111 173
장게려 114 165
박는이 108 181
윤나보 107 176
강는무 96 164
백아어 88 169
송보니 105 187
한문넣 118 187
정것어 113 169
배보입 80 178
배리입 89 184
안려넣 101 173
양은니 104 176
장는넣 87 179
유오리 97 193
안무입 68 167
조넣나 73 177
이는아 98 170
안스입 69 183
황아는 71 169
문스나 102 191
허어트 77 166
황려나 108 187
오렇리 86 165
박리넣 75 190
양다렇 73 165
장오를 69 172
신나나 75 170
양어니 107 189
손를입 108 176
고것무 66 179
홍보자 75 184
양문나 110 171
신무가 81 171
배어것 117 185
권름되 71 178
윤입이 112 169
최려는 80 177
한니이 94 191
문아이 113 166
윤이트 87 165
박를넣 115 176
최은를 96 192
임이이 114 186
권이어 115 181
손는오 89 171
양뭐이 65 188
step 9) 드디어....! bmi 공식을 적용한다.
bmifile = open("bbplayer.txt","r")
for line in bmifile:
이름,몸무게,키 = line.strip().split(",")
if not 몸무게.isdigit():
continue
몸무게 = int(몸무게)
키 = int(키)
#BMI 계산
bmi = 몸무게 / (키/100)**2
print(이름,몸무게,키,bmi)
bmifile.close()
step 10) bmi 지수에 따은 결과값도 같이 넣고 예쁘게 출력해보면
bmifile = open("bbplayer.txt","r")
for line in bmifile:
이름,몸무게,키 = line.strip().split(",")
if not 몸무게.isdigit():
continue
몸무게 = int(몸무게)
키 = int(키)
bmi = 몸무게 / (키/100)**2
결과 = ""
if 25 < bmi:
결과 = "과체중"
elif 18.5 <= bmi:
결과 = "정상체중"
else:
결과 = "저체중"
print("\n".join([
f"이름 :{이름}",
f"몸무게 :{몸무게}",
f"키 :{키}",
f"bmi :{bmi}",
f"결과 :{결과}",""
]))
bmifile.close()
참고1)
데이터 내부에 쉼표가 포함되면 → 데이터를 따옴표로 감싸야 한다
그런데 데이터 내부에 따옴표가 있다면 → 이스케이프 따옴표를 써야한다
그래서 쉼표와 따옴표가 포함되면 좀 구찮
참고2)
이후 pandas라는 라이브러리를 사용해서 CSV 파일을 간단하게 만들고 사용할 수 있지만... 일단 그동안의 내용을 복습하는 겸해서 열심히 코드를 읽고 사용하는 느낌으로 복습복습하세요.