파이썬으로 지번주소를 도로명주소로 변환하기, 코딩공부

업무를 하다보면 지번주소로 되어있는 옛날 자료들을 도로명주소로 바꿔야할 때가 있습니다.
인간적으로 30건 미만은 그냥 찾아서 하겠는데 그 이상으로 변환해야 할 자료가 많으면 좀 곤란해집니다.  

파이썬과 카카오 API를 활용해서 진행해보겠습니다. 

지번주소 정보가 담겨있는 엑셀 파일을 열어서 거기에 있는 주소들을 읽어오고
각 주소를 카카오API를 이용해서 웹에서 도로명 주소, 위도, 경도 정보를 찾아
새로운 엑셀 파일에 저장합니다.


0. 파이썬 설치 및 비주얼 스튜디오 설치

길어져서 생략합니다. 파이썬 설치, 비주얼 스튜디오 설치로 
웹 검색하시면 자세하게 설명된 글이 많습니다. 

0.5 카카오 API 발급

카카오 디벨로퍼스 사이트에 들어가서 로그인하고 상단 메뉴에서 내 애플리케이션을 클릭합니다.
서비스 이용 동의 페이지가 나타나는 경우 필수 항목에 동의하고, 개발자 이름을 입력한 다음 회원가입 버튼을 클릭해 다음 단계로 넘어갑니다. 
전체 애플리케이션 페이지가 나타나면, 애플리케이션 추가하기를 클릭합니다.
내용 대충 입력하시고 넘어갑니다. 

준비는 끝났습니다. 


1. 필요한 라이브러리 설치합니다.


import requests
import openpyxl
import time

*파이썬을 방금 설치하셨다면
cmd 열어서 pip install requests openpyxl 입력 하시면 됩니다.

requests: 웹에서 데이터를 가져오는 데 사용하는 라이브러리입니다.
openpyxl: 엑셀 파일을 다루는 데 사용하는 라이브러리입니다.
time: 잠시 기다리기 위해 사용합니다 (API 호출 속도 조절)

2. 카카오 API 인증을 위한 정보를 입력합니다.


# API 정보 설정
url = "https://dapi.kakao.com/v2/local/search/address.json"
REST_API_KEY = "카카오 API를 입력하세요"
headers = {"Authorization": f"KakaoAK {REST_API_KEY}"}

'카카오 API를 입력하세요' 부분에는 방금 발급받은 REST_API키를 붙여넣습니다.


3. 엑셀파일을 열고, 데이터를 기록할 파일을 생성합니다.


# 입력 및 출력 파일 설정
input_wb = openpyxl.load_workbook("address.xlsx")
input_ws = input_wb.worksheets[0]  # 첫 번째 시트 선택

output_wb = openpyxl.Workbook()
output_ws = output_wb.active
output_ws.append(["원본 주소", "도로명 주소", "지번 주소", "위도", "경도"])

input_wb = address.xlsx 엑셀파일을 읽어옵니다.
input_ws = 불러온 엑셀파일의 첫번째 시트를 읽어옵니다.

output_wb = 엑셀파일을 만들고
output_ws = 첫번째 시트에
output_ws.append = 헤더(제목)을 첫 번째 행으로 추가합니다.

입력한 원본주소, 도로명, 지번, 위도, 경도 4개만 표시하겠습니다.





4. API를 통해 주소를 검색하고 결과를 저장합니다.


# 주소 검색 및 결과 저장
for row in input_ws.iter_rows(min_row=2, max_col=1):  # 첫 번째 열만 읽음
    addr = str(row[0].value)  # 원본 주소 가져오기
    params = {"query": addr}
   
    try:
        resp = requests.get(url, params=params, headers=headers)
        resp.raise_for_status()  # 요청 성공 여부 확인
        data = resp.json()
       
        if data.get("documents"):  # 검색 결과가 있을 경우
            doc = data["documents"][0]
            road_address = doc.get('road_address', {}).get('address_name')
            address = doc.get('address', {}).get('address_name')
            longitude = doc.get('x')
            latitude = doc.get('y')
        else:
            road_address = address = longitude = latitude = None
       
        # 결과 저장
        output_ws.append([addr, road_address, address, latitude, longitude])
   
    except requests.exceptions.RequestException as e:
        print(f"Error fetching data for {addr}: {e}")
        output_ws.append([addr, None, None, None, None])
   
    time.sleep(0.5)  # 요청 간 간격을 두어 API 제한 방지

# 결과 저장 및 파일 닫기
output_wb.save("result_address.xlsx")
input_wb.close()
output_wb.close()

  • 주소 읽기: 엑셀 파일의 첫 번째 행부터 주소를 읽어옵니다.
  • 정보 검색: 읽어온 주소로 웹에서 정보를 검색합니다.
  • 정보 저장: 검색한 정보를 새 엑셀 파일에 저장합니다. 
  • 에러 처리: 주소를 찾지 못하거나 오류가 발생하면, None 값을 기록합니다.
  • time.sleep(0.5): 요청 사이에 잠시 텀을 둬서 API 조회시 오류를 방지합니다.



  • 5. 전체코드


    import requests
    import openpyxl
    import time

    # API 정보 설정
    url = "https://dapi.kakao.com/v2/local/search/address.json"
    REST_API_KEY = "0b1b993d6973c6eb2630cd4e3fa8d1b2"
    headers = {"Authorization": f"KakaoAK {REST_API_KEY}"}

    # 입력 및 출력 파일 설정
    input_wb = openpyxl.load_workbook("address.xlsx")
    input_ws = input_wb.worksheets[0]  # 첫 번째 시트 선택

    output_wb = openpyxl.Workbook()
    output_ws = output_wb.active
    output_ws.append(["원본 주소", "도로명 주소", "지번 주소", "위도", "경도"])

    # 주소 검색 및 결과 저장
    for row in input_ws.iter_rows(min_row=2, max_col=1):  # 첫 번째 열만 읽음
        addr = str(row[0].value)  # 원본 주소 가져오기
        params = {"query": addr}
       
        try:
            resp = requests.get(url, params=params, headers=headers)
            resp.raise_for_status()  # 요청 성공 여부 확인
            data = resp.json()
           
            if data.get("documents"):  # 검색 결과가 있을 경우
                doc = data["documents"][0]
                road_address = doc.get('road_address', {}).get('address_name')
                address = doc.get('address', {}).get('address_name')
                longitude = doc.get('x')
                latitude = doc.get('y')
            else:
                road_address = address = longitude = latitude = None
           
            # 결과 저장
            output_ws.append([addr, road_address, address, latitude, longitude])
       
        except requests.exceptions.RequestException as e:
            print(f"Error fetching data for {addr}: {e}")
            output_ws.append([addr, None, None, None, None])
       
        time.sleep(0.5)  # 요청 간 간격을 두어 API 제한 방지

    # 결과 저장 및 파일 닫기
    output_wb.save("result_address.xlsx")
    input_wb.close()
    output_wb.close()

    댓글 쓰기

    다음 이전