파이썬 프로젝트 및 응용/매일 아침 출근전 나만의 날씨 정보를 받아보자!!

(프로젝트) 출근전 날씨 정보를 메신저로 수신하기 - 1. 날씨 정보 실시간 받아오기 - 3) 16일 예상치 날씨 데이터 받아오기

파기차차 2022. 12. 18. 08:41
728x90
반응형
SMALL
728x90
반응형

ㅁ 개요

 

O 프로그램 소개

 

 

 - 이번 글은 이전글(2022.12.11 - [프로젝트 및 응용/매일 아침 출근전 나만의 날씨 정보를 받아보자!!] - (프로젝트) 출근전 날씨 정보를 메신저로 수신하기 - 1. 날씨 정보 실시간 받아오기 - 2) 현재 날씨 데이터 실시간 받아오기)에 이은 4번째 글로 16일치 예상치 날씨 데이트를 받아오는 방법에 대하여 설명합니다.

 

 

아래 유튜브 영상에서 해당 내용을 더욱 자세히 보실 수 있습니다.

 

 

 

 

 

 

O 완성된 프로그램 실행 화면

 

 

 - 최종 완성된 프로그램의 결과화면은 아래와 같습니다.

 

 

아래와 같이 프로그램 실행 시 API서버로 부터 16일 예상치 날씨 데이터 정보를 얻어 오며, 이 데이터를 가공하여 보기좋게 화면에 출력하였습니다.(16일 예상치 날씨 데이터는 유료이므로 실제로 우리는 무료인 5일치 데이터만 사용합니다.)

 

아래 빨간 박스의 결과는 현재시점 기준으로 16일치 날씨 데이터를 보여줍니다.(3시간 간격으로 온도, 습도, 날씨 등의 정보를 보여줌)

그리고 하단의 정보는 리스트로 저장한 정보를 보여주는 것이며, 추가로 우리는 테스트용으로 파일(weather.txt)로도 정보를 담아둘 것입니다.

 

 

아래는 파일로 저장한 위의 데이터를 열어본 모습입니다.

 

 

O 시작전 준비 사항

 

 - 이번글을 실습하기 위해서는 이전글(2022.12.11 - [분류 전체보기] - (프로젝트) 출근전 날씨 정보를 메신저로 수신하기 - 1. 날씨 정보 실시간 받아오기 - 1) API사용을 위한 회원가입)의 API 키가 있어야 합니다.

 


 

ㅁ 세부 내용

 

O 완성된 소스

 

 

소스파일 : 5.py

import requests


apikey = "" # 본인의 API키를 넣어주세요
city = "Seoul"
lang = "kr"

full_Url = f"http://api.openweathermap.org/data/2.5/forecast?id=524901&q={city}&appid={apikey}&lang={lang}&units=metric" # 분당 60번만 가능, 하루 간격 16일치 날씨 정보 조회

response_org = requests.get(full_Url).json()
print(response_org['list'])
print("###############################################################\n\n")
print(response_org['list'][0])
print("현재 시간: \t", response_org['list'][0]['dt_txt'])
print("온도: \t\t", response_org['list'][0]['main']['temp'])
print("체감 온도: \t", response_org['list'][0]['main']['feels_like'])
print("최저 온도: \t", response_org['list'][0]['main']['temp_min'])
print("최고 온도: \t", response_org['list'][0]['main']['temp_max'])
print("습도: \t\t", response_org['list'][0]['main']['humidity'])
print("기압: \t\t", response_org['list'][0]['main']['pressure'])
print("풍속: \t\t", response_org['list'][0]['wind']['speed'])
print("하늘: \t\t", response_org['list'][0]['weather'][0]['description'])

print("###############################################################\n\n")

import os
if os.path.isfile('weather.csv'):
    os.remove('weather.csv')

w_list = []
print("시간\t\t\t", "온도\t", "최저\t", "최고\t\t", "습도\t", "날씨\t")
for i in response_org['list']: #<-- 여기서부터 다시 시작
    # 화면에 출력하기
    print(i['dt_txt'], "\t", i['main']['temp'], "\t", i['main']['temp_min'], "\t", i['main']['temp_max'], "\t\t", i['main']['humidity'], "\t", i['weather'][0]['description'])

    # 리스트 변수에 담아두기
    w_list.append(str(i['dt_txt'])+","+ str(i['main']['temp'])+","+str(i['main']['temp_min'])+","+str(i['main']['temp_max'])+","+str(i['main']['humidity'])+","+str(i['weather'][0]['description']))

    # 파일에 쓰기
    with open('weather.csv', 'a', encoding='utf-8') as f:  # 쓰기
        f.write(str(i['dt_txt'])+","+ str(i['main']['temp'])+","+str(i['main']['temp_min'])+","+str(i['main']['temp_max'])+","+str(i['main']['humidity'])+","+str(i['weather'][0]['description'])+"\n")

print("+++++++++++++++++++++++++++++++++++")
print(w_list)

 

 

 

 

 

O 소스 실행 방법

 
 
 
 - 소스파일을 5.py로 저장 후 cmd, 파워쉘, 비주얼스튜디오코드 등에서 아래와 같이 실행하시기 바랍니다.
 
 
 > python 5.py

 

 


 
 

O 주요 내용

 

1. 아래 코드에 대한 설명은 이전글을 참고 부탁드립니다. 달라진 점은 아래와 같습니다.

 

이전글(현재 날씨 정보 받아오기)

https://api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}&appid={apikey}&lang={lang}&units=metric

 

현재글(16일 예상치 날씨 데이터 받아오기)

http://api.openweathermap.org/data/2.5/forecast?id=524901&q={city}&appid={apikey}&lang={lang}&units=metric

 

 

현재 API에 요청하려는 내용은 16일치 예상 날씨 데이터이므로 요청url이 약간 달라졌습니다.

 

 

 

 

2. 실행해 보면 결과가 딕셔너리로 리턴됨을 알 수 있습니다.

 

 

 

3. 일단 응답결과가 너무 많으니, 주요정보를 담고 있는 키인 'list'를 아래 코드와 같이 다시 요청해 보겠습니다.

 

 

 

 

4. 응답 결과는 아래와 같습니다.

16일치 데이터라서 결과가 너무 많아 눈에 한번에 들어오지 않고 있습니다.

 

 

 

 

5. 다시 응답결과를 보기좋게 줄이기 위해서 아래 코드와 같이 리스트의 첫번째 요소만 가져와 봅니다.

response_org['list'][0]

 

 

 

6. 응답결과를 보니 이제 좀 눈에 들어옵니다.

 

 

 

 

 

7. 여기에서 날씨 관련 주요 정보인 '현재시간', '온도', '습도' 등을 가져오기 위해서 아래 코드를 추가합니다.

 

 

 

 

8. 실행 결과 아래와 같이 꽤 그럴듯하게 나왔습니다.

 

 

 

 

 

 

9. 다시 이번에는 16일치 데이터를 모두 나오게 하도록 for문을 이용하여 돌려봅니다.

 

 

 

 

 

10. 16일 예상치 날씨 데이터가 3시간 간격으로 모두 출력되었으며, 유의미한 데이터로 보여집니다.

이걸 이용하면 꽤 좋은 정보로 활용이 가능할 것 같습니다.

 

아래 데이터를 자세히 보면 12/13(화)~12/15(목), 약 3일간은 추위가 상당할 것으로 예상됩니다.

 

 

 

 

11. 나중에 활용을 위해 일단, 리스트로도 출력해보고, 파일로도 저장해 보겠습니다.

 

 

 

12. 아래 하단에 리스트로 잘 출력된 것을 확인할 수 있습니다.

 

 

 

 

 

 

13. 그리고 탐색기의 해당 경로에 가니 weather.csv 파일로도 잘 저장된 것을 볼 수 있습니다.

 

 

 

 

 

 

 

 

 

 


 

 

O 소스 분석

 

1. 아래 파일 생성 시 'w' -> 'a'로 해주어야 파일에 값이 모두 쓰여집니다. 'w'모드로 하는 경우 맨 마지막 값으로 덮어쓰여지기 때문에 마지막 값만 보입니다.

    with open('weather.csv', 'a', encoding='utf-8') as f:  # 쓰기
        f.write(str(i['dt_txt'])+","+ str(i['main']['temp'])+","+str(i['main']['temp_min'])+","+str(i['main']['temp_max'])+","+str(i['main']['humidity'])+","+str(i['weather'][0]['description'])+"\n")

 


 

ㅁ 정리

 

O 우리가 배운 내용

 
 - 오늘은 날씨 관련 정보를 수집하는 방법 중 16일 예상치 날씨 데이터를 받아오는 방법에 대하여 알아보았습니다.
 
 
 
 
 - 오늘 우리가 배운 내용을 요약 정리해 보면 아래와 같습니다.
 
 
 
 
1. 16일 예상치 날씨 데이터를 API요청으로 가져왔습니다.
http://api.openweathermap.org/data/2.5/forecast?id=524901&q={city}&appid={apikey}&lang={lang}&units=metric
 
2. 가져온 데이터를 이쁘게(?) 가공 후 화면에 뿌려주었습니다.
 
3. 향후 활용을 위해 파일로도 저장해 두었습니다.
    with open('weather.csv', 'a', encoding='utf-8') as f:  # 쓰기
        f.write(str(i['dt_txt'])+","+ str(i['main']['temp'])+","+str(i['main']['temp_min'])+","+str(i['main']['temp_max'])+","+str(i['main']['humidity'])+","+str(i['weather'][0]['description'])+"\n")
 
 

 

오늘은 여기까지이며, 위의 내용이 유익하셨다면, 좋아요와 구독 부탁드립니다.

 

 

감사합니다.

 

 

728x90
반응형
LIST