-
65 - (파이썬) CSV 파일 읽고 쓰기study with Q - 파이썬 2024. 7. 8. 17:28
텍스트를 사용해 데이터를 구조적으로 표현할 수 있는 방법으로는 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 파일을 간단하게 만들고 사용할 수 있지만... 일단 그동안의 내용을 복습하는 겸해서 열심히 코드를 읽고 사용하는 느낌으로 복습복습하세요.
'study with Q - 파이썬' 카테고리의 다른 글
67 - (파이썬) 가독성과 유지보수성 (0) 2024.07.15 66 - (파이썬) 이터러블, 이터레이터, 제너레이터 함수, 제너레이터 표현식 (0) 2024.07.09 64 - (파이썬) 기본 파일 처리 (0) 2024.07.08 63 - (파이썬) 람다, key 키워드 매개변수 (0) 2024.07.03 62 - (파이썬) map/filter 함수 구현 (0) 2024.07.03