Stage3 - 데이터 엑셀파일로 저장하기

이번 스테이지에서는 데이터를 엑셀로 저장할 수 있는 OpenPyXL패키지 사용법에 대해 배우고, 수집한 데이터를 엑셀파일(.xlsx)에 저장합니다.

OpenPyXL패키지로 엑셀파일 만들기

OpenPyXL 소개/설치

OpenPyXL은 파이썬을 활용해서 엑셀파일을 읽고 쓸 수 있는 파이썬 오픈소스 패키지입니다. 엑셀프로그램을 켜서 할 수 있는 대부분의 작업을 OpenPyXL을 통해 할 수 있습니다.

pip 명령어를 사용하거나, 파이참에서 OpenPyXL패키지를 설치합니다. 외부 패키지 설치방법 다시보기 >> 3주차 Stage1.

엑셀의 구조 이해하기

OpenPyXL은 엑셀의 구조를 그대로 활용하기 때문에, OpenPyXL을 통해 엑셀을 사용하려면 엑셀 구성요소의 이름을 알고 있어야 합니다.

Workbook: 엑셀파일 전체 작업공간, 엑셀파일 자체를 Workbook이라고 부릅니다. Worksheet: 엑셀파일에서 단일 작업공간, 하나의 큰 표라고 생각할 수 있습니다. Cell: 엑셀에서 데이터가 저장되어있는 가장 작은 공간입니다.

엑셀 파일 만들기/저장하기

# openpyxl을 가져옵니다.
import openpyxl
# 워크북(엑셀파일)을 새로 만듭니다.
wb = openpyxl.Workbook()
# 워크북(엑셀파일)을 원하는 이름으로 저장합니다.
wb.save('test.xlsx')

기본적으로 OpenPyXL은 엑셀의 작업순서 그대로 활용하기 때문에 openpyxl.Workbook()은 새로만들기, 워크북.save(파일이름)은 저장하기와 1:1로 대응됩니다.

시트 선택하기/데이터 쓰기

week4_4.py
# openpyxl을 가져옵니다.
import openpyxl
# 워크북(엑셀파일)을 새로 만듭니다.
wb = openpyxl.Workbook()
# 현재 활성화된 시트를 선택합니다.
sheet = wb.active
# A1셀에 hello world!를 입력합니다.
sheet['A1'] = 'hello world!'
# 워크북(엑셀파일)을 원하는 이름으로 저장합니다.
wb.save('test.xlsx')

워크북.active는 엑셀이 켜져있다고 생각할 때, 현재 활성화되어있는 시트를 선택해줍니다. 시트 안에 특정한 셀에 데이터를 입력하고 싶다면, 리스트의 인덱싱 방법과 마찬가지로 대괄호를 활용하여 시트[셀번호]에 값을 넣어주면 됩니다.

숫자로 데이터 입력하기

sheet.cell(row=3, column=3).value = "BYE!!"

셀번호를 통해 데이터를 입력하는 방식은 정확한 셀번호를 알지 못하면 입력하기 어렵고 반복작업을 하기 쉽지 않기 때문에 시트.cell(row=m, column=n).value를 이용하면 m행 n열에 데이터를 입력할 수 있습니다.

가장 마지막 줄에 데이터 입력하기

subject = ["Python", "Java", "HTML", "JavaScript"]
sheet.append(subject)

시트.append(리스트)함수를 사용하면, 시트의 데이터가 없는 가장 첫 줄에 데이터를 입력합니다. 이때 append의 괄호 안에는 리스트를 넣어줍니다. 리스트 값의 구분에 따라 열이 구분되어 입력됩니다.

데이터를 가장 쉽게 저장할 수 있는 방법 중 하나이기 때문에 앞으로 가장 많이 사용하게 될 OpenPyXL함수 입니다.

*추가: 알면 좋은 시트 관련 OpenPyXL 함수

week4_4.py
import openpyxl
wb = openpyxl.Workbook()
# sheet1은 활성화되 있는 시트를 선택
sheet1 = wb.active
# sheet1의 시트이름 변경
sheet1.title = "1st sheet"
# 새로운 시트 만들고 sheet2에 저장
sheet2 = wb.create_sheet("2nd sheet")
# sheet1과 sheet2에 동시에 데이터 쓰기
for i in range(1, 10):
sheet1.cell(row=i, column=1).value = i
sheet2.cell(row=1, column=i).value = i
wb.save('test.xlsx')

워크북.create_sheet(시트이름) : 새로운 시트를 원하는 이름으로 만듭니다. 워크북[시트이름]: 특정 시트를 선택합니다. 시트.title(시트이름): 시트의 이름을 바꿉니다.

시트 관련 함수를 사용하면 한 번에 여러개의 시트에 동시에 작업을 할 수 있기 때문에 여러가지 데이터를 동시에 수집할 수 있습니다.

네이버 TV 데이터 수집 결과 엑셀파일로 저장하기

#0. 지난 코드 불러오기(3주차 Challenge1.)

3주차 challenge1의 데이터수집 코드를 가져옵니다. 3주차 - challenge1. *Stage2에서 활용한 코드와 같습니다.

week4_5.py
import requests
from bs4 import BeautifulSoup
raw = requests.get("https://tv.naver.com/r")
html = BeautifulSoup(raw.text, "html.parser")
# 1위 - 100위 컨테이너 선택자: dl.cds_info
clips = html.select("dl.cds_info")
for cl in clips:
# 수정된 부분
title = cl.select_one("dt.title").text.strip()
chn = cl.select_one("dd.chn").text.strip()
hit = cl.select_one("span.hit").text.strip()
like = cl.select_one("span.like").text.strip()
print("제목", title)
print("채널명", chn)
print(hit)
print(like)
print("="*50)

#1. 워크북 만들기 & 헤더 만들기

week4_5.py
import requests
from bs4 import BeautifulSoup
import openpyxl
# 새로운 워크북 만들기
wb = openpyxl.Workbook()
# 현재 시트 선택
sheet = wb.active
# 헤더 추가하기
sheet.append(["제목", "채널", "재생 수", "좋아요 수"])
raw = requests.get("https://tv.naver.com/r")
html = BeautifulSoup(raw.text, "html.parser")
...

엑셀 파일에 데이터를 저장하기 위해서 openpyxl패키지를 가져와서 워크북을 만들고 시트를 선택합니다. 가장 첫줄에 append함수를 활용해서 데이터의 헤더 부분을 만들어줍니다.

#2. 수집한 데이터 쓰기 / 엑셀파일 저장하기

week4_5.py
... 생략
for cl in clips:
# 수정된 부분
title = cl.select_one("dt.title").text.strip()
chn = cl.select_one("dd.chn").text.strip()
hit = cl.select_one("span.hit").text.strip()
like = cl.select_one("span.like").text.strip()
print("제목", title)
print("채널명", chn)
print(hit)
print(like)
print("="*50)
# 워크북에 데이터를 추가합니다.
# append함수에는 리스트 형식으로 데이터를 넣어줍니다.
sheet.append([title, chn, hit, like])
# 데이터 수집결과를 navertv.xlsx
wb.save("navertv.xlsx")

csv파일 저장, 엑셀 파일 저장 비교하기

수집된 데이터의 파일 저장 방법은 csv파일과 엑셀파일이 크게 다르지 않습니다. 다만 아래 몇가지 차이점이 있기 때문에 상황에 맞게 수집한 데이터를 저장하는 것이 가장 좋습니다.

  1. csv파일의 용량이 작습니다.

  2. 엑셀파일은 ,또는 \n를 신경쓸 필요없습니다.

  3. 엑셀파일은 한 번에 여러시트에서 작업할 수 있습니다.

  4. 엑셀 파일은 인코딩문제에서 조금 더 자유롭습니다.