본문 바로가기
프로그래밍/데이터분석

데이터분석, 파이썬 CSV 파일 불러오기, 경로 오류 처리, 한글깨짐(utf-8) 보정 (feat. numpy, pandas)

by K-인사이터 2024. 4. 22.
반응형

안녕하세요 

K-인사이트입니다. 


데이터 분석에서 가장 중요한 절차 중 데이터를 입력하고 이를 적절히 처리하는 과정입니다. 데이터 저장 및 유통에 가장 많이 사용되는 포맷은 csv(comma-separated values) 파일 포맷입니다. 간소한 포맷과 엑셀 등의 프로그램에서 읽어오기 용이한 형태입니다. 이 파일을 읽어오면서 데이터 분석의 관문이 열리게됩니다. 하지만 csv 파일을 불러올 때 데이터 분석을 어렵게 하는 요인들이 있습니다. 예를 들어, 불러오기 경로 오류, 한글 깨짐 오류 등이 있습니다. 이 글에서는 파일 불러오기와 관련된 다양한 유형들을 다루어 보도록 하겠습니다. 

 

파이썬 환경 구축 

pipenv 를 통해서 간편하게 원하는 파이썬 환경을 구성할 수 있습니다. 관련된 내용은 아래의 링크를 참고해주세요. 

https://k-in.tistory.com/174

 

파이썬 버전관리, pipenv를 이용한 개발환경관리

안녕하세요 K-인사이트 입니다. Maven, Gradle 처럼 파이썬 프로젝트의 버전 관리의 필요성을 느끼는 분들이 많을 것입니다. 예를 들어 특정 파이썬 인터프리터 버전을 고정해서 사용하고 싶거나 프

k-in.tistory.com

 

판다스(Pandas)를 이용한 CSV 파일 불러오기 

pip install pandas 명령어를 통해서 간편하게 패지키를 설치할 수 있습니다. pandas 패키지는 임포트할 때 pd 라는 약어를 보통 사용합니다. 이는 사람들이 사용하면서 굳어져 온 것이므로 반드시 지켜야하는 약속은 아닙니다. 

 

판다스 패키지에서 제공하는 read_csv 함수를 사용하면 간편하게 csv 파일을 불러올 수 있습니다. 판다스는 csv 외에도 clipboard, excel, hdf, html, json 등 다양한 포맷에 대한 읽어오기 함수들을 지원합니다. 

import pandas as pd

c_master = pd.read_csv('./day1/customer_master.csv')
c_master.head()

 

 

파일 불러오기 경로 오류 처리 

csv 파일을 읽어오는 도중에 파일 불러오기 에러가 발생할 수 있습니다. 대개 이 경우는 파일 이름 규칙을 바탕으로 대량의 파일을  읽어오면서 발생합니다. 따라서 경로를 찾기에 실패할 경우에는 FileNotFoundError 에러만 별도로 처리하는 방식으로 코딩을 하면 됩니다. 

import pandas as pd

for x in range(0, 2):
    try: 
        filename = f'./day{x}/customer_master.csv'
        c_master = pd.read_csv(filename)
    except FileNotFoundError as e: 
        print(filename)
        continue # 존재하지 않을 경우 간단한 에러문구를 남기고 다음 루프로 이동합니다.

 

혹은 구글 코랩(colab)을 사용할 때 경로를 "/content/파일이름" 과 같이 지정하지 않으면 파일 읽어오기 에러가 발생하는 경우가 있습니다. 이 경우에는 상대경로가 아닌 절대 경로로 아래와 같이 입력하면 됩니다. 

i_master = pd.read_csv('/content/day1/item_master.csv')
i_master.head()

 

한글 깨짐 오류 처리하기, KRX 주가 정보 불러오기  

대한민국 정부에서 제공하는 공공 데이터를 활용하는 경우에 자주 발생하는 에러입니다. 예를들어 xls 파일형식의 데이터를 한국거래소(KRX)에서 다운로드 받아서 이를 변환한다고 가정해 보겠습니다. 이때는 requests 패키지가 필요하므로 pip install requests 명령어를 통해서 패키지를 우선 설치합니다. 

 

다음으로 KRX 홈페이지에서 xls 파일을 다운로드 받습니다. 주의할 내용은 해당 xls 파일의 데이터는 euc-kr 포맷으로 작성되어 있다는 점입니다. 이때 유용하게 사용할 수 있는 패키지는 io 패키지입니다. BytesIO 를 통해서 메모리에 우선 로드를 한 뒤에 decode, encode 를 통해서 utf-8 파일로 변환을 합니다. 

 

아래는 euc-kr 인코딩 에러를 해결하는 매우 실전적인 예시입니다. 다른 예시들을 보면 불필요하게 여러 패키지들을 사용하는데 효율적인 방법들이 아닙니다. 아래의 예시를 적절히 변형해서 응용하면 대부분의 인코딩 문제를 해결할 수 있습니다. 

import pandas as pd
import requests
from io import BytesIO
import os 

url = 'http://kind.krx.co.kr/corpgeneral/corpList.do?method=download&searchType=13'

response = requests.get(url)
response.raise_for_status()  # 에러 체크

# 다운로드한 바이너리 데이터를 메모리상의 파일로 취급
excel_data = BytesIO(response.content)
excel_data = BytesIO(excel_data.getvalue().decode('euc-kr').encode('utf-8'))

output_file_path = '24년도 상장 법인 목록.xls' # 저장할 파일 데이터
dataset_path = os.path.join('./datasets',output_file_path)

# 인코딩을 utf-8 으로 변환한 xls 데이터를 다시 저장   
with open(dataset_path, 'wb') as file:
	file.write(excel_data.getvalue())

# xls 파일 내부는 html 데이터임 
df_listing = pd.read_html(dataset_path)[0]
# 불러온 데이터에 칼럼 정보를 다시 작성
cols_ren = {'회사명':'Name', 
            '종목코드':'Code', 
            '업종':'Sector', 
            '주요제품':'Industry', 
            '상장일':'ListingDate', 
            '결산월':'SettleMonth',  
            '대표자명':'Representative', 
            '홈페이지':'HomePage', 
            '지역':'Region', }
# 작성된 칼럼 정보를 반영
df_listing = df_listing.rename(columns = cols_ren)
# 주가 코드 정보를 수정
df_listing['Code'] = df_listing['Code'].map('{:06d}'.format)

# 변환된 데이터를 csv 파일로 저장
csv_file_path = '24년도 상장 법인 목록.csv'
dataset_csv_path = os.path.join('./datasets',csv_file_path)
df_listing.to_csv(dataset_csv_path, index=False)
df_listing

넘파이(numpy)를 이용한 CSV 파일 읽어오기 

pandas 뿐만 아니라 numpy 역시 많이 사용되는 패키지입니다. 행렬 연산 등의 작업을 할때 매우 유리합니다. 항상 pandas 데이터를 어떻게 numpy 에서 처리하느냐 하는 문제들을 고민하는 학생들을 많이 보았습니다. numpy 역시 genfromtxt 함수를 제공하며 여기서 구분자(delimiter)를 입력해주면 csv 파일 등을 간편하게 불러올 수 있습니다. 

from numpy import genfromtxt
my_data = genfromtxt('my_file.csv', delimiter=',')

 

판다스(Pandas)를 이용한 특정 행부터 읽어오기 

CSV, 엑셀 파일 등을 읽어오다보면 파일을 생성한 생성자가 불필요한 데이터를 남기는 경우가 있습니다. 아래의 표를 한번 볼까요? 

K-인사이트에서 제공하는 데이터입니다. 
데이터 관련 문의는 k-in@gmail.com 으로 연락주세요 
칼럼1 칼럼2 칼럼3
100 200 300
200 400 500

 

 

위 표는 csv 파일 포맷을 테이블화한 내용입니다. 시작부터 두줄은 불필요한 데이터가 삽입되어 있습니다. 판다스는 읽어올 때 옵션으로 몇개의 행을 건너뛸지를 지정할 수 있는 skiprows 옵션이 있습니다. 아래의 예시를 볼까요? 

import pandas as pd
df = pd.read_csv("example.csv", skiprows=2) # 첫 두줄을 건너뛰고 데이터를 읽어옴
print(df)

 

만약 세줄을 건너뛰고 읽어와야 한다면 skiprows=3 을 지정하면 됩니다. 판다스는 이렇게 여러상황에 대응하도록 설계되어 있습니다. 

 

판다스(Pandas)를 이용한 엑셀 파일에서 원하는 영역만 추출하기 

가장 많이 사용될 예시입니다. 앞서 판다스는 엑셀 등의 다양한 파일의 데이터를 잘 읽어온다고 알려드렸습니다. 만약 여러분의 엑셀 파일에서 특정 시트의 어떠한 영역만 불러온다고 가정을 해볼까요? 조금 더 구체적으로 시나리오를 정의해보겠습니다. 

 

  • test.xlsx 파일을 연다
  • "테스트 결과" 시트네임의 데이터가 필요하다
  • 정보는 B 열에서 E 열에 위치해 있다. 
  • B 열은 인덱스 정보로 사용된다. 
  • 1행을 건너뛰고 2행부터 테이블이 시작한다. 
  • 데이터의 맨마지막 5개 행은 불필요한 데이터로 건너뛴다. 

위 요구사항은 일반적인 엑셀 시트에서 불필요한 데이터를 제외하고 원하는 데이터를 불러오는 전형적인 예시입니다. 아래의 파일은 위 예시를 그대로 반영한 파일입니다.

 

 

위 그림에서 붉은색으로 표시한 영역만 불러오도록 하겠습니다. 우선 가장 중요한 패지키가 설치되어야 합니다. 반드시 아래의 명령어를 실행하고 예시코드를 실행해주세요! openpyxl 패키지는 엑셀파일을 파싱하는 역할을 수행합니다. 

  • pip install openpyxl
import pandas as pd
df = pd.read_excel(io='~/test.xlsx', 
                   sheet_name='테스트 결과',
                   usecols='B:E', 
                   index_col = 0,
                   skiprows=1, 
                   skipfooter=5)
print(df)

 

옵션을 보겠습니다. io 옵션은 파일의 경로를 지정합니다. sheet_name은 읽어올 시트의 이름입니다. usecols 는 어떤 칼럼을 불러올지를 정합니다. B열에서 E열까지 범위를 지정합니다. 다음으로 데이터에서 인덱스를 어떤 칼럼으로 할지를 결정합니다. 예시 파일의 "순서" 칼럼을 지정하므로 0번째 칼럼으로 지정합니다. skiprows 칼럼은 불필요한 행을 건너뛰고 읽어오도록 지정합니다. skipfooter 는 불필요한 다섯개 행을 제외하라는 의미입니다. 

 

 

아래의 그림은 코드가 실행되면 우리가 의도한대로 데이터를 읽어온 것을 확인할 수 있습니다. 너무 정확하게 의도대로 동작을 해서 신가합니다. 이렇게 옵션만 알고 있다면 얼마든지 응용이 가능하니 평소에 읽어들이고 싶었던 자료가 있다면 테스트해보시길 추천드립니다. 

 

이상입니다.

K-인사이트 올림. 

반응형