본문 바로가기
Python

[Python] pandas를 이용하여 엑셀 데이터 뽑기

by 태진아밴드 2021. 11. 19.

9월에 이직을 하고 난 뒤로 정신없이 지내다보니 또 다시 블로그가 잊혀져있었다.

 

올해도 얼마 안남았는데 부지런해지기는 아무래도 글렀나보다😂

 

몇일전에 회사 동료분이 지하철 정보 관련해서 엑셀로 저장해야한다는데 일일히 수동으로 한다고 하시길래

 

그냥 내가 자동화 해서 엑셀만들어서 드린다고 해서 작업한적이 있었다.

 

어드민페이지나 이런데에 붙어야 하는게 아니라 일회성으로 사용되는거라 파이썬으로 만들었는데 일단 적어보자.

 

먼저 파이썬에서 엑셀을 다루기위해 많이쓰이는 pandas와 openpyxl을 설치해보자

 

# pandas 설치
pip install pandas
# openpyxl 설치
pip install openpyxl

 

우선 위와 같은 엑셀 파일을 전달 받았고 저기에서 역 이름을 읽어온 뒤

 

주소검색 api를 태우고 해당 정보들을 엑셀로 만드는게 목표였다.

 

근데 카카오 주소 api로 역이름 검색을 해봤는데 안나오는게 함정..!

 

그래서 도로명 주소 api랑 네이버 api도 마찬가지인가 싶어서 검색해봤더니 둘다 되길래 우선 카카오랑 네이버를

 

혼용해서 사용하기로했다.

 

카카오도 역이름으로 조회하게 해주세요..ㅠ
네이버는 잘나온다!

백문이 불여일타 나머지는 코드로 살펴보자.

 

import datetime as date
import requests
import pandas as pd

############################
# 지하철역 리스트 조회
############################

print('[' + str(date.datetime.now().strftime('%Y.%m.%d %H:%M:%S')) + ']' + ' 지하철역 리스트 조회 시작')

# 엑셀파일 읽어오기
xlsx = pd.read_excel('./excel/지하철역_리스트.xlsx')
# 조회해야 할 지하철역명
station_arr = []
i = 0
while i < xlsx['지역명'].index.stop:
    station_nm = xlsx['지역명'][i]
    station_arr.append(station_nm.lstrip() + '역')
    i = i + 1

# 시/도
sido_arr = []
# 시/군/구
sigungu_arr = []
# 지번주소
jibun_addr_arr = []
# 도로명주소
road_addr_arr = []
# 경도
x_arr = []
# 위도
y_arr = []

for station in station_arr:

    # 역 이름으로 주소 찾기 (네이버 API)
    header = {'X-Naver-Client-Id': '본인이 발급받은 Client-Id', 'X-Naver-Client-Secret': '본인이 발급받은 Client-Secret'}
    naver_api_url = 'https://openapi.naver.com/v1/search/local.json?query=' + station
    response = requests.get(url=naver_api_url, headers=header)
    juso_size = len(response.json().get('items'))
    if (juso_size > 0):

        # 지번 주소 추출
        jibun_addr = response.json().get('items')[0].get('address')
        # 도로명 주소 추출
        road_addr = response.json().get('items')[0].get('roadAddress')
        
        query = road_addr
        if ( road_addr == ''):
            query = jibun_addr

        # 좌표 및 시군구 찾기 (카카오 API)
        header = {'Authorization': 'KakaoAK 본인이 발급받은 키'}
        kakao_api_url = 'https://dapi.kakao.com/v2/local/search/address.json?query=' + query
        response = requests.get(url=kakao_api_url, headers=header)

        xy_size = len(response.json().get('documents'))

        if (xy_size > 0):
            # 시도
            sido = response.json().get('documents')[0].get('address').get('region_1depth_name')
            # 시군구
            sigungu = response.json().get('documents')[0].get('address').get('region_2depth_name')
            # 경도
            longitude = response.json().get('documents')[0].get('x')
            # 위도
            latitude = response.json().get('documents')[0].get('y')

            sido_arr.append(sido)
            sigungu_arr.append(sigungu)
            jibun_addr_arr.append(jibun_addr)
            road_addr_arr.append(road_addr)
            x_arr.append(longitude)
            y_arr.append(latitude)
        else:
            print('[좌표 검색결과 없음] : ' + station)
            sido_arr.append('')
            sigungu_arr.append('')
            jibun_addr_arr.append('')
            road_addr_arr.append('')
            x_arr.append('')
            y_arr.append('')

    else:
        print('[역 검색결과 없음] : ' + station)
        sido_arr.append('')
        sigungu_arr.append('')
        jibun_addr_arr.append('')
        road_addr_arr.append('')
        x_arr.append('')
        y_arr.append('')

# 지하철역 주소 엑셀화
raw_data = {}

raw_data['지하철역'] = station_arr
raw_data['시/도'] = sido_arr
raw_data['시/군/구'] = sigungu_arr
raw_data['지번주소'] = jibun_addr_arr
raw_data['도로명주소'] = road_addr_arr
raw_data['경도'] = x_arr
raw_data['위도'] = y_arr

raw_data = pd.DataFrame(raw_data)
raw_data.to_excel(excel_writer='./excel/지하철역_조회결과.xlsx')

print('[' + str(date.datetime.now().strftime('%Y.%m.%d %H:%M:%S')) + ']' + ' 지하철역 리스트 조회 종료')

네이버 api로 조회 후, 결과가 있을경우엔 해당 주소로 카카오 api를 호출하여 주소 상세부분을 추출해서 엑셀화시키는 코드이다.

 

역 검색결과나 좌표 검색 결과가 없는 역들은 따로 출력해서 남게끔 처리했다.

 

실행 후 만들어진 엑셀을 살펴보면 위와 같이 만들어지는걸 확인할 수 있다.

 

중간중간 검색 결과가 잘못된 부분들은 수동으로 수정 후 엑셀 데이터를 넘겨줬다.

 

파이썬은 너무 편해서 좋은거같다🙌