본문 바로가기
Python

23. 파이썬 엑셀(Excel) 다루기3 - openpyxl with 파파고

by To올라운더 2023. 8. 2.
반응형

스스로 코드를 만들어 갈 수 있는 능력이 있다면

처음부터 끝까지 혼자서 코딩을 할 수도 있지만, 그러기에는 내가 가진 시간과 노력의 가성비가 맞지 않다.

 

그래서 우리는 넓은 인적 인프라를 통한 강점을 가진 파이썬을 배우고 있다 

(나만 필요한건 없다.... 내가 필요하다면 누군가 먼저 기반을 닦아 놓은 코드들이 분명히 있지 않을까 의심해보자.)

 

서두에 언급한 것 처럼 처음부터 내가 코드 전부를 만드는것이 아니라

다른 사람의 라이브러리나 코드를 인용해서 사용하는 것인데,

목적과 유사하거나 일치하다면 그대로 사용해도 되고

차이가 있다면 일부 수정하거나 해당 코드를 참고하는 것만으로도 많은 도움이된다.

(시간이 가면서 더 느끼겠지만, 왠지 내가 만든 코드 보다 남들이 만든 코드가 더 신뢰가 간다.....ㅋㅋ)

 

아무튼 우리는 얼굴은 모르지만 훌륭한 동료들이 작성한 API나 라이브러리를 이용해 볼텐데,

오늘은 openpyxl의 마지막 포스팅으로 이전 시간 API를 연습하며 다루던 파파고(papago) 번역과의 연계 작업이다.

 

(* 아직 API 연동이 낯설거나 어렵다면 아래 글을 확인하시기 바랍니다.)

2023.07.18 - [IT 배우기/Python] - 20. 파이썬 네이버 API(Papago) 연동하기1

 

20. 파이썬 네이버 API(Papago) 연동하기1

1. 네이버 개발자센터 가입하기 - 검색 포털에서 [네이버 개발자센터]를 검색한 뒤 로그인을 진행한다. https://developers.naver.com/main/ NAVER Developers 네이버 오픈 API들을 활용해 개발자들이 다양한 애

to-all-rounder.tistory.com

 

파파고를 연결할 기본 코드는 다 짜여져 있다.

우리가 이번 시간에 해볼 내용은 지금까지 배운 Excel(openpyxl)을 API를 이용해 다뤄 보는 것이다.

 

1. 파파고(papago) API 코드

  1) naver_trans_api_token.py

    - 실제 해당 파일 없이 파이썬 코드에 바로 입력을 해도 되지만,  API ID와 Secret Key 같은 경우, 은행 계좌와 비밀번호라고 생각하며 노출을 최소화 하기 위해 별도로 파일을 작성한다. 해당 파일의 경로는 2)에서 사용하는 실제 연동 코드와 같은 경로에 저장한다.

# naver_trans_api_token.py 로 저장하여야 예제와 같은 이름으로 import 가능 
naver_trans_api_token = {'client_id' : '발급받은 Client_id', 'client_secret' : '발급받은 Client_secret'}

  2) 파파고 API

  - 위의 1) naver_trans_api_token.py를 사용하지 않을 경우, 10, 12라인에 해당 값을 직접 입력해주면 된다.

import os
import sys
import urllib.request
import naver_trans_api_token as ntoken # 네이버 API 계정 정보
from ast import literal_eval # str to dict

def papago_call(source_text):

    #client_id = "YOUR_CLIENT_ID" # 개발자센터에서 발급받은 Client ID 값
    client_id = ntoken.naver_trans_api_token['client_id']
    #client_secret = "YOUR_CLIENT_SECRET" # 개발자센터에서 발급받은 Client Secret 값
    client_secret = ntoken.naver_trans_api_token['client_secret']
    encText = urllib.parse.quote(source_text) # 번역하고자 하는 문장 입력
    data = "source=ko&target=en&text=" + encText    # 한국어 -> 영어 로 변환
    url = "https://openapi.naver.com/v1/papago/n2mt"
    request = urllib.request.Request(url)
    request.add_header("X-Naver-Client-Id",client_id)
    request.add_header("X-Naver-Client-Secret",client_secret)
    response = urllib.request.urlopen(request, data=data.encode("utf-8"))
    rescode = response.getcode()
    if(rescode==200):
        response_body = response.read()
        response_result = response_body.decode('utf-8')
            
        res_result_to_dict= literal_eval(response_result)
        # print(type(res_result_to_dict)) # 결과 값 : dict
        # print(res_result_to_dict)
        # print('\n\n번역 내용 :')
        result = res_result_to_dict['message']['result']['translatedText']
        print(result) # 결과 값 : Hello
        return result
    else:
        print("Error Code:" + rescode)

 

2. Excel 파일 만들기

  - 아래와 같은 단순한 엑셀파일이다. ( 해당 Excel 파일을 같은 workspace 폴더에 저장하거나 절대 경로를 이용해 사용할 수 있다.)

  - 번역은 파파고가 할 예정이라 신뢰도가 높지만 다양한 테스트를 위해 성격이 다른 동요의 가사와 일반적인 글들을 예문으로 사용할 예정이다.

openpyxl_papago_test.xlsx
0.01MB

 - 해당 파일을 특정 경로 또는 파이썬 코드와 같은 경로에 복사해준다.

 - 같은 경로에 1)에서 생성한 naver_trans_api_token.py 파일과 다운받은 excel 파일을 저장하면 사전 준비는 끝났다.

 

 

3. 저장된 Excel 파일 파이썬에서 불러오기

 - 실제 번역할 데이터는 C4셀부터 시작한다.

import os
import sys
import urllib.request
import naver_trans_api_token as ntoken # 네이버 API 계정 정보
from ast import literal_eval # str to dict

def papago_call(source_text):

    #client_id = "YOUR_CLIENT_ID" # 개발자센터에서 발급받은 Client ID 값
    client_id = ntoken.naver_trans_api_token['client_id']
    #client_secret = "YOUR_CLIENT_SECRET" # 개발자센터에서 발급받은 Client Secret 값
    client_secret = ntoken.naver_trans_api_token['client_secret']
    encText = urllib.parse.quote(source_text) # 번역하고자 하는 문장 입력
    data = "source=ko&target=en&text=" + encText    # 한국어 -> 영어 로 변환
    url = "https://openapi.naver.com/v1/papago/n2mt"
    request = urllib.request.Request(url)
    request.add_header("X-Naver-Client-Id",client_id)
    request.add_header("X-Naver-Client-Secret",client_secret)
    response = urllib.request.urlopen(request, data=data.encode("utf-8"))
    rescode = response.getcode()
    if(rescode==200):
        response_body = response.read()
        response_result = response_body.decode('utf-8')
            
        res_result_to_dict= literal_eval(response_result)
        # print(type(res_result_to_dict)) # 결과 값 : dict
        # print(res_result_to_dict)
        # print('\n\n번역 내용 :')
        result = res_result_to_dict['message']['result']['translatedText']
        print(result) # 결과 값 : Hello
        return result
    else:
        print("Error Code:" + rescode)


from openpyxl import Workbook, load_workbook #excel 파일 load를 위한 import

excel_file_path = r'.\openpyxl_papago_test.xlsx' # '.\' 은 현재 경로를 나타낸다.

# 위에서 생성된 통합문서 불러온 뒤, 점수 불러오기
wb = load_workbook(excel_file_path)
sheets_name = wb.sheetnames[0] # 첫번째 sheet 열기 
ws = wb[sheets_name]

max_row_no = ws.max_row  # 데이터가 입력되어 있는 마지막 행번호 확인
print(f'max_row_no : {max_row_no}')


for i in range(4, max_row_no+1): # C4셀 부터 최대 행까지 반복문 진행
    if ws.cell(column = 3, row = i).value != None:
        source_text = ws.cell(column=3, row = i).value # C열 해당 셀 값 저장
        result_text = papago_call(source_text) # 번역 값 받아오기
        ws.cell(column = 4, row = i).value = result_text # D열 해당 셀에 입력

wb.save(excel_file_path)

 - 앞선 포스팅의 papago API 사용과 openpyxl 내용에 익숙해졌다면, 코드는 어렵지 않게 분석할 수 있을 것이다.

 - 코드를 간단히 살펴보면, 저장된 excel 파일을 불러오기 위해 36, 38라인에서 excel 파일에 대한 경로를 지정해 주고

 - 41라인에서 Workbook으로 wb 객체를 만든다.

 - 해당 wb 안에 있는 sheet 중 1번째(index 0번) 을 사용한뒤 max_row_no 값을 구하는데, 결과 값을 보면 알 수 있듯이 실제 텍스트 내용은 14행까지만 입력되어 있으나, 선 그리기로 인해 max_row 값이 26이 나오는 것을 볼 수 있다.

 - for 반복문을 통해 C열의 C4부터 C26까지 반복문을 수행하게 되는데,

 - 50 라인에 value 값에 값이 입력되어 있을 경우에 기능을 수행할 수 있게 조건문을 추가하였다.

 - 이후 51라인에서 C열 값 확인하여 papago_call 함수를 실행하고, 결과 값을 D열에 입력하는 코드이다.

 - 결과 값은 아래와 같이 확인할 수 있다. 

 

코딩을 할 수 있다면, 업무에서 불필요한 부분을 많이 제거하고 효율적으로 일을 할 수 있다.

엑셀이 아니더라도 특정 사이트의 자료들을 크롤링한다던지, 반복적으로 처리해야하는 업무를 컴퓨터에게 시키기만 하면

나의 삶은 더 윤택해진다. 

 

오늘도 파이썬!!

반응형