ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 파일을 간단하게 만들고 사용할 수 있지만... 일단 그동안의 내용을 복습하는 겸해서 열심히 코드를 읽고 사용하는 느낌으로 복습복습하세요.

     


    https://replit.com/@wh3308/CSV-file#main.py

Designed by Tistory.