[SK shieldus Rookies 16기][Python] Excel 다루기

Jina·2023년 11월 1일
0

SK shieldus Rookies 16기

목록 보기
5/59
post-thumbnail
post-custom-banner

1. Python에서 Excel 다루기

  • .xlsx 구조화된 이진 파일
  • 하나의 워크북 = .xlsx 파일 하나로 저장됨
  • 워크북 내에 하나 이상의 워크시트로 구성
  • 현재 사용중인 워크 시트 = 액티브 시트
  • 워크시트는 행(column)과 열(row)로 구성
  • 행과 열이 만나는 사각형 공간을 cell 라고 함
  • 각 셀은 숫자나 문자 등을 포함

2. 엑셀 지원 라이브러리

openpyxl

  • 엑셀 파일 생성, 편집, 읽기 기능을 지원(삭제는 불가)
  • .xlsx 형식 파일을 다룰 수 있다.
  • 대용량 데이터 처리에는 적합하지X

1) 설치

pip install openpyxl

2) 엑셀 파일과 엑셀 시트 불러오기

import openpyxl

wb = openpyxl.load_workbook('example.xlsx')
print(wb.active) # <Worksheet "Sheet1">

ws = wb.active

3) value 셀에 부여된 값 확인

print(ws.['A1']) # <Cell 'Sheet1'.A1>
print(ws.['A1'].value) # This is Sheet1

4) coordinate 셀 좌표 확인

b = ws['B1']
print(b.coordinate) # B1
print(b.value) # This is Sheet1 B1 Cell

5) column / row

  • get_column_letter()
    행열의 인덱스 번호나 열의 표시 문자를 가져와주는 함수
from openpyxl.utils import get_column_letter,column_index_from_string

# 열 인덱스를 숫자 → 문자
# 1번째 열의 문자
print(get_column_letter(1)) # A 

# 2번째 열의 문자
print(get_column_letter(2)) # B

# 27번째 열의 문자
print(get_column_letter(27)) # AA

# 현재 워크시트의 최대 열
print(get_column_letter(ws.max_column)) # C

# 열 인덱스를 문자열 → 숫자
print(column_index_from_string('AA')) # 27
  • columns의 값을 리스트로 가져오기
for cell_obj in list(ws.columns)[0]:
    print(cell_obj.value)

# This is Sheet1 A1 Cell
# This is Sheet1 A2 Cell
# This is Sheet1 A3 Cell

6) 셀 스타일링

  • 폰트 스타일 변경
import openpyxl
# 스타일변경을 하려면 openpylx.styles를 가져와야 한다.
from openpyxl.styles import Font,Color

wb = openpyxl.Workbook('파일명.xlsx')
ws = wb.active

font = Font(name='Tahoma', # 폰트 종류
          size=20, # 폰트 사이즈
          bold=True, # 폰트 굵게(True/False)
          italic=True, # 폰트 기울기(True/False)
          color='FFC0CB') # 폰트 색상(hex code)
                        
ws['A1'].font = font # A1셀에 폰트 스타일 적용
wb.save('파일명.xlsx') # 같은 이름으로 저장하면 덮어쓰기 된다.

8) del 엑셀 시트 삭제

# wb = openpyxl.load_workbook('example.xlsx')
del wb['워크시트 이름']

8) save() 엑셀 파일 저장

wb.save('파일명.xlsx')

Pandas

  • 대용량 데이터 처리와 분석을 위한 라이브러리
  • 기본적으로 엑셀 파일 읽고,쓰기 기능 외 데이터 조작, 정제, 분석, 시각화 등 다양한 데이터 처리 기능 지원
  • 데이터프레임이라는 자료 구조를 제공
    • 데이터프레임은 테이블 형태로 데이터를 구조화하여 저장 가능 → 데이터프레임을다루기 위한 다양한 메서드와 기능들이 있기 때문에 데이터 분석,조작,처리 작업이 편리함
    • 판다스의 데이터프레임은 데이터 정체,필터링,변형,병합,그룹화 등 다양한 데이터 가공작업이 가능
    • 가공된 데이터를 시각화 라이브러리(Matplotib,Seaborn)을 사용하여 그래프 생성 가능
  • 라이브러리가 무거움
  • 복잡한 기능이나 많은 메모리를 요구하는 작업에서 성능 이슈 발생할 수 있음

1) 설치

pip install pandas

2) read_excel() 엑셀 파일에서 특정 시트 값 읽기

# padas 모듈을 가져오고 pd 라고 부르겠다.
import pandas as pd

df = pd.read_excel('example.xlsx',sheet_name='Sheet1')
print(df)
# This is Sheet1 A1 Cell  This is Sheet1 B1 Cell  This is Sheet1 C1 Cell
# 0  This is Sheet1 A2 Cell  This is Sheet1 B2 Cell  This is Sheet1 C2 Cell
# 1  This is Sheet1 A3 Cell  This is Sheet1 B3 Cell  This is Sheet1 C3 Cell

3) to_excel() 엑셀 파일 저장

# df(DataFrame)
df.to_excel('example_from_pandas.xlsx',index=False)

4) read_html() html에서 table가져오기

# table이 존재하는 url만 가능
# 한국어의 경우 인코딩을 안해주면 글자가 깨져서 나올 수도 있다.
pd.read_html('https://mizykk.tistory.com/39', header=0, encoding='utf-8') 

'''
[    과일  색상     가격
 0   사과  빨강  1500원
 1   사과  초록  1000원
 2  바나나  노랑  3000원
 3  바나나  초록  2000원,
      국가   도시     언어
 0    한국   서울    한국어
 1    미국   뉴욕     영어
 2  이탈리아  피렌체  이탈리아어
 3   프랑스   파리     불어,
   한국어        영어
 0  1월   January
 1  2월  Feburary
 2  3월     March,
               [Python] 리스트 정렬하기 :: sort / sorted (0)  2021.02.10
 0    [Python] 영문 > 한글 키보드 입력 변환하기 :: 자모결합 / 자소결합 (0)  2021.01.29
 1  [Python] for문(반복문) 진행상황 표시 :: tqdm / tqdm_note...  2021.01.28
 2  [Python] has no attribute 'compat' (most likel...  2020.10.05
 3               [Python] 위경도 거리 구하기 :: haversine (1)  2020.01.28]
'''

Xlwings

  • 엑셀의 매크로(VBA)와 파이썬을 연동해서 사용
  • 엑셀에서 커스텀 함수 만들 수 있음
  • 데이터 작업 속도 빨라짐

1) 설치

pip install xlwings
xlwings addin install

2) 엑셀 파일에서 시트 연결

import xlwings
import pandas

wb = xlwings.Book('파일명.xlsx')
sheet = wb.sheets[0] # 첫번째 시트 읽어오기

3) value() 셀에 값 설정

# 셀 A1에 값 설정
sheet.range('A1').value() = 'Hello'
sheet.range('A1') # 'Hello'

# 셀 A2부터 A5까지 값으로 25를 설정
sheet.range('A2:A5').value() = 25

3) formula() 셀에 수식 설정

# 셀 A2~A5까지의 값의 합계를 구하는 수식
sheet.range('A6').formula = '=SUM(A2:A5)'

4) 창 없이 매크로를 실행하고 싶을 때

# 엑셀 인스턴스 생성 => 안 보이게
app = xlwings.App(visible=False)

# 여기에 실행할 코드 삽입

# 인스턴스 종료 => 엑셀 프로그램 종료
app.kill() 

3. 미니 프로젝트 : 구구단

터미널에서 사용자로부터 2개의 값을 입력받아 엑셀에 구구단 표를 작성하고, 작성된 내용을 엑셀 파일로 저장하는 프로그램을 만들어 봤다.

import openpyxl
import sys

# 엑셀에 구구단을 만드는 함수
def main(file_name, M, N):
    wb = openpyxl.Workbook() # 워크북>워크시트>셀
    ws = wb.active #활성화된 워크시트

    # %%
    ws['A1'] = ''
    print(ws['A1'].value)
    # A2~A5까지 1~4까지 값 입력
    for n in range(1, N+1):
        ws.cell(row=n+1,column=1).value = n
    # B2~F5까지 1~4까지 값 입력
    for m in range(1, M+1):
        ws.cell(row=1,column=m+1).value = m

    for m in range(1, M+1):
        for n in range(1, N+1):
            ws.cell(row=n+1,column=m+1).value = m*n

    file_name = file_name.split('.')[0] # 파일명과 확장자명을 .을 기준으로 나눠서 파일명만 가져오기
    wb.save(f'{file_name}.xlsx') # 매번 파일 이름을 지정하기 귀찮으므로..

if __name__=='__main__':
    # 실행하려면? 
    # 1. multiplicationTable.py가 있는 폴더로 이동
    # 2. 터미널에 python multiplicationTable.py 값1 값2 입력
    file_name = sys.argv[0]
    M = int(sys.argv[1])
    N = int(sys.argv[2]) 
    main(file_name, M, N)

    # os 모듈 : 운영체제 관리할 때 쓰는 모듈, 파일 외적으로 관리하는 모듈.

argv(argument vector) 란?

  • argument - 프로그램을 실행할 때 커맨드 라인(터미널)에서 입력한 값들을 의미
  • vector - 여러 개의 값을 저장할 수 있는 데이터 구조
  • sys.argv 의 첫번째 요소는 스크립트의 경로, 두 번째부터는 입력된 값을 의미

argumentparameter 의 차이?

  • parameter : 함수 정의나 호출 시 함수가 필요로 하는 값(자료형,값의 개수)
  • argument : 함수 호출 시 실제로 전달되는 값
def sum(a,b) : # 여기서 a,b는 sum함수에서 필요로 하는 값을 나타내는 것 
	sum = a+b

sum(1,2) # 함수를 호출하면서 동시에 값을 전달한다. 이때 이 값이 argument다.
profile
공부 기록
post-custom-banner

0개의 댓글