44. pandas를 이용하여 엑셀 파일에 기록하기

안녕하세요. 언휴예요.

이전 글에서 네이버 개발자센터에서 제공하는 Open API 서비스를 이용하여 도서 검색 프로그램을 작성했었죠. 이번에는 검색한 결과를 엑셀 파일에 기록하는 부분을 추가할 거예요.

Python에서 엑셀에 기록하는 방법은 매우 다양합니다. 여기에서는 그 중에 pandas 패키지를 이용하는 방법을 사용할 거예요. 이를 위해서는 pandas 패키지를 설치해야 합니다. Visual Studio에서 Python 패키지를 설치하는 방법은 앞에서 이미 다루었죠.

pandas 패키지를 설치하였으면 새로운 프로젝트를 생성하세요. 전체 소스 코드는 앞에서 작성했던 소스 코드와 대부분 비슷하므로 이전에 작성한 소스 코드를 복사 및 붙여넣기 하세요.

import 구문을 하나 추가합니다. 여기에서는 pandas를 짧게 pd로 사용할 수 있게 할게요.

 import pandas as pd

item 항목들의 부모 요소인 items와 새로 생성하여 기록할 경로(파일) 명을 입력 인자로 받아 item 항목을 엑셀 파일에 저장하는 함수를 정의하세요.

 #엑셀 파일에 기록하기
def makeexel(items,path):

먼저 파일에 기록할 데이터를 리스트에 보관한 후에 한꺼번에 엑셀 파일에 기록할 거예요. 이를 위해 비어있는 리스트를 선언하세요.

    result=[]

items의 각 자식 항목들의 제목과 설명 내용을 리스트 항목에 추가합니다. 이 때 제목과 설명은 독립적인 컬럼 값으로 사용할 것이므로 대괄호로 구분한 후에 더하기 연산을 사용하세요.

    for item in items:
        result.append([item.title.get_text()]+[item.description.get_text()])

pandas의 DataFrame 기능에 기록할 자료를 보관한 리스트와 컬럼 정보를 인자로 전달하면 테이블 형태로 기록할 수 있는 개체를 반환합니다.

    table = pd.DataFrame(result,columns=('title','description'))

table 변수로 멤버 to_excel 함수를 호출하면 엑셀 파일에 기록합니다.

    table.to_excel(path)

마지막으로 main 함수 맨 뒷부분에 makeexel 함수를 호출합니다. 이 때 items와 기록할 파일 경로를 전달합니다.

makeexel(items,"d:\\data\\py\\data.xlsx")

다음은 실습으로 작성한 전체 소스입니다.

#제목: 도서 검색 결과 엑셀 파일로 저장하기

import urllib.request
from bs4 import BeautifulSoup
import pandas as pd


def searchbook(title):
    #애플리케이션 클라이언트 id 및 secret
    client_id = "[네이버에서 발급받은 자신의 애플리케이션 클라이언트 ID]"
    client_secret = "[네이버에서 발급받은 자신의 애플리케이션 SECRET]"
    
    #도서검색 url
    url = "https://openapi.naver.com/v1/search/book.xml"
    option = "&display=3&sort=count"    
    query = "?query="+urllib.parse.quote(title)
    url_query = url + query + option
    
    #Open API 검색 요청 개체 설정
    request = urllib.request.Request(url_query)
    request.add_header("X-Naver-Client-Id",client_id)
    request.add_header("X-Naver-Client-Secret",client_secret)
    
    #검색 요청 및 처리
    response = urllib.request.urlopen(request)
    rescode = response.getcode()
    if(rescode == 200):
        return response.read().decode('utf-8')
    else:
        return None

#검색 결과 항목 정보 출력하기
def showitem(item):
    print('<--------------------------')
    print('제목 : ' + item.title.get_text())
    print('설명 : ' + item.description.get_text())
    print('-------------------------->\n')

#엑셀 파일에 기록하기
def makeexel(items,path):
    result=[]
    for item in items:
        result.append([item.title.get_text()]+[item.description.get_text()])
    table = pd.DataFrame(result,columns=('title','description'))
    table.to_excel(path)

#프로그램 진입점
def main():
    #검색 질의 요청
    res = searchbook(input("질의:"))
    if(res == None):
        print("검색 실패!!!")
        exit()
    xmlsoup = BeautifulSoup(res,'html.parser')
    items = xmlsoup.find_all('item')    
    for item in items:
        showitem(item)
    makeexel(items,"d:\\data\\py\data.xlsx")

#진입점 함수를 main으로 지정
if __name__ == '__main__':
    main()