Gachon CS50 File Handling Character Separate Values 가천대학교 산업경영공학과 최성철교수
CSV
CSV 파일이란 ㆍ필드를쉼표 (,) 로구분한텍스트파일 ㆍ엑셀양식의데이터를프로그램에상관없이쓰기위한데이터형식이라고생각하면쉬움 ㆍ콤마뿐만아니라탭 (TSV), 빈칸 (SSV) 등으로구분해서만들기도함, 이런것들을통칭하여 character-separated values (CSV) 부름 ㆍ엑셀에서는 다름이름저장 기능으로사용가능
엑셀로 CSV 파일만들기 ㆍ파일다운로드 from GitHub https://github.com/teamlab/cs50_example_code/blob/master/16_csv/data_population.xls ㆍ파일열기 ㆍ파일 다른이름으로저장 CSV( 쉼표로분리 ) 선택후 파일명입력 ㆍ엑셀종료후 Notepad 로파일열어보기
엑셀로 CSV 파일만들기 데이터가, 로나눠져있음
CSV 파일읽기 / 쓰기 ㆍ Text 파일형태로데이터처리예제 ㆍ예제데이터 : customer.csv (https://raw.githubusercontent.com/teamlab/cs50_example_code/master/16_csv/customers.csv) ㆍ일반적 textfile 을처리하듯파일을읽어온후, 한줄한줄씩데이터를처리함
예제데이터형식 해당데이터는고객의 FullName, 성, 이름, 전화번호, 국가등기록, 로분리
CSV 파일읽기 line_counter = 0 # 파일의총줄수를세는변수 data_header = [] # data 의필드값을저장하는 list customer_list = [] # cutomer 개별 List 를저장하는 List read_csv.py Vim Editor with open ("customers.csv") as customer_data: # customer.csv 파일을 customer_data 객체에저장 while 1: data = customer_data.readline() # customer.csv에한줄씩 data 변수에저장 if not data: break # 데이터가없을때, Loop 종료 if line_counter==0: # 첫번째데이터는데이터의필드 data_header = data.split(",") # 데이터의필드는 data_header List에저장, 데이터저장시, 로분리 else: customer_list.append(data.split(",")) # 일반데이터는 customer_list 객체에저장, 데이터저장시, 로분리 line_counter+=1 print ("Header :\t", data_header) # 데이터필드값출력 for i in range(0,10): # 데이터출력 ( 샘플 10개만 ) print ("Data",i,":\t\t",customer_list[i]) print (len(customer_list)) # 전체데이터크기출력
CSV 파일쓰기 line_counter = 0 data_header = [] customer_usa_only_list = [] write_csv.py Vim Editor with open ("customers.csv", "rb") as customer_data: while 1: data = customer_data.readline().decode('utf-8') if not data: break if line_counter==0: data_header = data.split(",") else: customer = data.split(",") if customer[10].upper() == "USA": #customer 데이터의 offset 10번째값 customer_usa_only_list.append(customer) # 즉 country 필드가 USA 것만 line_counter+=1 #sutomer_usa_only_list에저장 print ("Header :\t", data_header) for i in range(0,10): print ("Data :\t\t",customer_usa_only_list[i]) print (len(customer_usa_only_list)) with open ("customers_usa_only.csv", "w") as customer_usa_only_csv: for customer in customer_usa_only_list: customer_usa_only_csv.write(",".join(customer)) #cutomer_usa_only_list 객체에있는데이터를 customers_usa_only.csv 파일에쓰기
CSV 객체사용하여 CSV 처리 ㆍ Text 파일형태로데이터처리시문장내에들어가있는, 등에대해전처리과정이필요 ㆍ파이썬에서는간단히 CSV 파일을처리하기위해 csv 객체를제공함 ㆍ예제데이터 : korea_floating_population_data.csv wget Bash shell https://raw.githubusercontent.com/teamlab/cs50_example_code/master/16 _csv/korea_floating_population.csv ㆍ예제데이터는국내주요상권의유동인구현황정보 ㆍ한글로되어있어한글처리가필요
예제데이터형식 ㆍ시간대 / 조사일자 / 행정구역 / 날씨등을기준으로연령별 / 성별유동인가해당지역에몇명인가표시
CSV 객체활용 #-*- coding: utf-8 -*- import csv seoung_nam_data = [] header = [] rownum = 0 all_data = [] use_csv_object.py Vim Editor with open("korea_floating_population.csv","r", encoding='utf8') as p_file: csv_data = csv.reader(p_file) #csv 객체를이용해서 csv_data 읽기 for row in csv_data: # 읽어온데이터를한줄씩처리 if rownum == 0: header = row # 첫번째줄은데이터필드로따로저장 location = row[7] # 행정구역 필드데이터추출 all_data.append(row) if location.find(u" 성남시 ")!= -1: seoung_nam_data.append(row) # 행정구역 데이터에성남시가들어가있으면 seoung_nam_data List에추가 rownum +=1 with open("seoung_nam_floating_population_data.csv","w", encoding='utf8') as s_p_file: writer = csv.writer(s_p_file, delimiter='\t', quotechar="'", quoting=csv.quote_all) #csv.writer를사용해서 csv 파일만들기 # delimiter 필드구분자 quotechar는필드각데이터는묶는문자, quoting는묶는범위 writer.writerow(header) # 제목필드파일에쓰기 for row in seoung_nam_data: writer.writerow(row) #seoung_nam_data에있는정보 list에쓰기
CSV 객체사용결과 성남시데이터만추출
[ 추가 ] Pandas 를활용한데이터분석 ㆍ Pandas 는데이터분석을위한파이썬모듈 ㆍ고수준의자료구조와데이터분석도구를포함함 ㆍ쉽게생각하면파이썬으로엑셀의피봇테이블같은기능을사용할수있게지원함 ㆍ그냥엑셀쓰면안됨? 됨 ㆍ하지만지금은 BIG Data 시대. 데이터크기너무커지면엑셀만으로처리하기가매우어려움
[ 추가 ] Pandas 를활용한데이터분석 ㆍ문제 : 성남시주요지역중맑은날과비올때 10 대가가장붐비는곳은? ㆍ예제데이터를 pandas 를사용하여분석후 그래프출력해보기연습
Pandas 활용 #-*- coding: utf-8 -*- import pandas as pd import matplotlib.pyplot as plt import matplotlib.font_manager as font_manager pandas_example.py Vim Editor # pandas 의 read_csv 함수로파일데이터읽어오기, 날씨와행정구역명을인덱스로지정 data_frame = pd.read_csv('seoung_nam_floating_population_data.csv', \ sep="\t", header=0, quotechar="'", encoding='utf-8',lineterminator="\n", \ index_col=[u' 날씨 ', u' 행정구역명 '], error_bad_lines=false) # 날씨와행정구역명을기준으로데이터를 group 화하고각필드별데이터의합을구함 group_data = data_frame.groupby(level=[u' 날씨 ',u' 행정구역명 ']).sum() # 날씨인덱스가 비 인경우의 남자 10 대 필드의데이터를추출하여 horizontal bar chart 로출력 ax = group_data.ix[u' 비 '][u' 남자 10 대 '].plot(kind='barh') # 한글출력을위해 chart 내한글폰트지정 axis = ax.yaxis font = font_manager.fontproperties(fname='c:\\windows\\fonts\\ngulim.ttf') for text in axis.get_ticklabels(): text.set_font_properties(font) # chart 화면에띄우기 plt.show()
Pandas 결과 비오는날은상대원 2 동 맑은날은야탑 1 동