본문 바로가기

programming

[Python] Spreadsheet 데이터 파일 ods 읽고 dataframe 만들기

안녕하세요 직장인 library 입니다.

 

 Programming 관련해서 글을 처음 올리는데, 무엇부터 작성하는 게 좋을지 감이 잘 안 잡히네요.

우선, 가장 최근에 작업해봤던 ods file 읽은 후 data 비교를 소개해보려고 합니다.

 

이번 포스팅에서는 ods Spreadsheet 읽고 셀 데이터를 pandas dataframe으로 만들기 입니다.


1. 필요 module 설치

 

 konsole에서 작업하는 경우 pip install을 이용해서 설치하시면 됩니다. 저는 PyCharm IDE를 사용 중이며,

setting > Project > Python Interpreter > Package install을 이용해서 설치하였습니다.

 

 설치 필요 module

  - Pandas : 데이터 조작 및 분석을 위한 파이썬 프로그래밍 언어 용으로 작성된 소프트웨어 라이브러리

  - Ezodf : open spread sheet 입출력을 위한 라이브러리

  - lxml : 내부 트리 구조를 가지고 있는 파일을 표현하기 위해 사용하는 파싱(Parser) 역할 라이브러리

 

2. Code 구성

 

 제가 사용한 방식은 ods 특정 sheet를 바라보고 row 별로 읽어들이며,

cell 값을 row_data list에 추가, 그리고 리스트들을 다시 row_values list에 추가합니다.

이후 list 내 첫번때 라인을 column의 head로 설정하고 dataframe 형식으로 설정해줍니다.

 

import pandas as pd
import ezodf
import os

base_path = os.getcwd() + "\\"

def read_ods(filename, sheetname):
    try:
        sheet = ezodf.opendoc(filename=base_path + filename).sheets[sheetname]
    except KeyError:
        raise KeyError("Unable to open" + filename)

    row_values = []
    for row in sheet.rows():
        row_data = []
        for cell in row:
            row_data.append(cell.value)
        row_values.append(row_data)
    df = pd.DataFrame(row_values[1:], columns=row_values[0])
    
    print(df)

if __name__ == '__main__':
    read_ods('Target.ods','sheet_in_file')

 

Code 구성에 따라 동작하게 된다면, 'Target.ods' 파일을 읽고 dataframe을 만들게 되는데, 

아래는 예시로 만들어본 dataframe 결과물 입니다.

 

 

3. Code 설명

#module import
import pandas as pd
import ezodf
import os

#py 현재 경로 확인
base_path = os.getcwd() + "\\"

# read_ods function 선언
def read_ods(filename, sheetname):
    try:
    	#'ezodf.opendoc' 사용하여 파일 open 시 절대 경로 입력, '.sheets' memberfunction으로 sheet 설정	
        sheet = ezodf.opendoc(filename=base_path + filename).sheets[sheetname]
    except KeyError:
        raise KeyError("Unable to open" + filename)

	
    #row와 column 별로 순서대로 읽어들이면서 cell 값을 list에 추가하는 방식
    #row_values list 선언
    row_values = []
    #'sheet.rows()'의 row 별로 loop 설정 
    for row in sheet.rows():
    	#row_data list 선언
        row_data = []
        #'row'의 cell별로 접근할 수 있게 loop 설정
        for cell in row:
        	#각 'cell' data를 'row_data' list에 담기 
            row_data.append(cell.value)
        #모든 'cell'값이 row_data에 담기면 'row_values'list에 담기
        row_values.append(row_data)
    #'row_values[1:]' 첫번쨰 요소를 제외한 나머지 모든 요소의 list, dataframe의 data로
    #'columns=row_values[0]' 첫번째 값은 columns의 head로 사용하는 것으로 선언
    df = pd.DataFrame(row_values[1:], columns=row_values[0])
    
    #만들어진 dataframe 프린트하기
    print(df)

if __name__ == '__main__':
	#read_ods function에 인자 'Target.ods','파일내 dataframe만들 sheet name'
    read_ods('Target.ods','sheet_in_file')

 

 자세한 설명들은 곁들이지 않고 코드 사용 및 이해에 필요한 내용만 설명을 해보았습니다.

ods내 data 양이 많을 경우에 다른방식으로 읽어야 할 수도 있지만, 저 같은 경우는 위 코드로 파일을 읽을 때, debugging하기도 편해서, row별로, colum별로 data를 읽는 방식을 많이 사용합니다.

 

코드는 copy and paste!

 

By workerslibrarian.