본문 바로가기
SW 개발/Data 분석 (RDB, NoSQL, Dataframe)

Python Pandas로 Excel과 CSV 파일 입출력 방법

by Kibua20 2021. 7. 21.

Pandas에서는 다양한 파일 입력을 지원하고 있습니다.  현재 Pandas는 버전 V1.3.0이며, 현 버전 기준으로 Pickling, Flat file, Clipboard, Excel, JSON, Html, Laxtex, HDF, SAS, SPASS, SQL, Google BigQuery, STATA의 파일 포맷을 지원하고 있으며, 이 중에서 일반적으로 가장 많이 사용하고 있는 Excel과 CSV 파일을 읽고 쓰는 방법을 설명합니다.    

 

Panda dataframe의  파일 입출력 지원 포맷

 

Pandas로 Excel 파일 읽기: Local File과 Http URL도 지원함

Pandas에서 Excel 파일을 읽기 위해서는 Excel Reader를 설치해야 합니다. Pandas에서 기본적으로 xlrd를 사용하고 있으며 xls포맷만 지원합니다. 만일 xlsx인 엑셀 파일을 읽어야 한다면  openplyxl을 설치해야 합니다. 따라서 xlrd 보다는 최신 포냇의 xlsx까지 지원하는 penplyxl 파일 설치를 추천드립니다.  openpyxl 파일만 설치되어 있어도 pandas 엑셀 파일 입출력 동작에는 문제가 없습니다. 

 

$ sudo pip3 install xlrd opnepyxl

xlrd 모듈 설치 (xls 포맷만 지원함)

 

openpyxl (xls, xlsx 포맷 모두 지원)

 

xlrd 또는 openpyxl 모듈이 없는 경우 에러 메시지:

Traceback (most recent call last):
  File "/Users/kibua20/git/DevDocs/pandas_example/test_dataframe_groupby.py", line 6, in <module>
    df = pd.read_excel('./Grade_Sample.xlsx')
  File "/usr/local/lib/python3.9/site-packages/pandas/util/_decorators.py", line 299, in wrapper
    return func(*args, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/pandas/io/excel/_base.py", line 336, in read_excel
    io = ExcelFile(io, storage_options=storage_options, engine=engine)
  File "/usr/local/lib/python3.9/site-packages/pandas/io/excel/_base.py", line 1140, in __init__
    self._reader = self._engines[engine](self._io, storage_options=storage_options)
  File "/usr/local/lib/python3.9/site-packages/pandas/io/excel/_xlrd.py", line 24, in __init__
    import_optional_dependency("xlrd", extra=err_msg)
  File "/usr/local/lib/python3.9/site-packages/pandas/compat/_optional.py", line 109, in import_optional_dependency
    raise ImportError(msg) from None
ImportError: Missing optional dependency 'xlrd'. Install xlrd >= 1.0.0 for Excel support Use pip or conda to install xlrd.

 

Traceback (most recent call last):
  File "/Users/kibua20/git/DevDocs/pandas_example/test_dataframe_groupby.py", line 6, in <module>
    df = pd.read_excel('./Grade_Sample.xlsx')
  File "/usr/local/lib/python3.9/site-packages/pandas/util/_decorators.py", line 299, in wrapper
    return func(*args, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/pandas/io/excel/_base.py", line 336, in read_excel
    io = ExcelFile(io, storage_options=storage_options, engine=engine)
  File "/usr/local/lib/python3.9/site-packages/pandas/io/excel/_base.py", line 1111, in __init__
    raise ValueError(
ValueError: Your version of xlrd is 2.0.1. In xlrd >= 2.0, only the xls format is supported. Install openpyxl instead.

 

Panda에서 엑셀 파일 읽기 예제

Pandas에서 read_excel() 함수는 다음과 같이 선언되어 있습니다.  읽는 엑셀 파일에 여러 Sheet가 있는 경우 Sheet 이름을 지정할 수 있습니다. 또한 index column 지정,  dtype  지정 등 다양한 옵션을 설정할 수 있습니다.   또한 파일이 PC의 로컬 파일뿐 아니라 인터넷 상의 URL로  엑셀 파일을 읽어올 수 있습니다. 

read_excel() 파일 정의

 

예제 코드와 결과는 다음과 같습니다.  pd.read_excel() 함수는 pandas.core.frame.DataFrame 자료형으로 반환합니다.  샘플 파일은 아래 파일 링크 또는 GitHub 링크(Raw)에 있습니다.  아래 테스트 코드도 동일한 GitHub 링크에 올라가 있습니다.

Grade_Sample.csv
0.00MB
Grade_Sample.xlsx
0.01MB

import pandas as pd

# excel 파일 읽기
df1 = pd.read_excel('./Grade_Sample.xlsx', sheet_name='Sheet1')

# url에서 excel 읽기
df = pd.read_excel('https://raw.githubusercontent.com/kibua20/devDocs/master/pandas_example/Grade_Sample.xlsx')
print (type(df))
print (df)

 

 엑셀을 읽어 출력한 결과는 다음과 같습니다. 

Pandas Excel파일 읽기

 

 

Pandas에서 CSV 파일 읽기와 저장

Pandas에서 read_csv()함수를 사용해서 CSV 파일을 Dataframe으로 변환할 수 있습니다.  filepath는 로컬 파일뿐 아니라 URL도 지원하며, 각  항목의 구분가 기본값으로는 comma(,)로 설정되어 있으며, tab (\t)나  특정 기호 (e.g. : 표시)를 지정할 수 있습니다.  index column이 있는 경우 index_col을 통해서 지정 가능합니다.  실제로는 매우 다양한 설정 옵션이 있으며, 입력 CSV 파일에 따라서 지정할 수 있습니다.    

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import pandas as pd
# csv file에서 읽기
df = pd.read_csv('./copy_grade_sample.csv')

# url에서 csv 읽기
df = pd.read_csv('https://raw.githubusercontent.com/kibua20/devDocs/master/pandas_example/Grade_Sample.csv')

# csv file로 저장
print ('Write to csv')
df.to_csv('copy_grade_sample.csv', index=False, encoding='utf-8-sig')

 

Pandas에서 csv파일 저장은  df.to_csv() 파일을 사용할 수 있고, Index column의 저장 여부를 index 값을 통해서 설정할 수 있습니다. CSV에 한글이 포함되어 있는 경우 encoding type을 'utf-8-sig'로 설정하여 한글 깨짐 또는 유니코드 깨지는 현상을 방지할 수 있습니다. 

 

관련 글:

[SW 개발/Python] - Python 정규식(Regular Expression) re 모듈 사용법 및 예제

[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - Python KoNLPy와 WordCloud를 활용하여 WordCloud 생성하기 (Sample code 포함)

[SW 개발/Python] - Python: JSON 개념과 json 모듈 사용법

[SW 개발/Python] - Python으로 개행 문자(\n)가 포함된 JSON 읽기: JSONDecodeError 수정하기

[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - Panda Dataframe 날짜 기준으로 데이터 조회 및 처리하기

[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - Pandas Dataframe 여러 열과 행에 apply() 함수 적용 (Sample code 포함)

[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - Dataframe(또는 Numpy)를 JSON 출력 시 에러: TypeError: Object of type int64 is not JSON serializable

[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - CSV 파일에서 MariaDB(또는 MySQL)로 데이터 가져오는 방법

[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - MariaDB의 Python Connector 설치와 사용 방법

[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - Jupyter Notebook의 업그레이드: Jupyter Lab 설치 및 extension 사용법




댓글