//AdSenseにリンク

取得データをPDF(日本語)で書き出すpythonコード

必要なライブラリのインストール

Pythonのfpdf2ライブラリを使用します。このライブラリを使ってデータをPDFファイルに書き出します。

pip install gtts fpdf2

日本語を使用する場合フォントファイルをダウンロード

日本語をサポートするフォントファイル(例: ipag.ttf)をダウンロードして、スクリプトと同じディレクトリに保存します。ipag.ttfIPAフォントからダウンロードできます。

ダウンロード手順:

  1. IPAフォントの公式サイトにアクセスします。
  2. “IPAexフォント"または"IPAPフォント"を選択し、ダウンロードします。
  3. ダウンロードしたZIPファイルを解凍し、ipag.ttfファイルをスクリプトと同じディレクトリに配置します。

コード

こちらの内容に追記しています。

コード

追記したコードです。

import requests
import datetime
from openpyxl import Workbook, load_workbook
from openpyxl.utils import get_column_letter
from openpyxl.styles import Font
import os
from gtts import gTTS
from fpdf import FPDF

def get_weather_data(api_key, city):
    url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}&units=metric"
    response = requests.get(url)
    data = response.json()
    return {
        "date": data["dt"],
        "city": data["name"],
        "temperature": data["main"]["temp"],
        "feels_like": data["main"]["feels_like"],
        "temp_min": data["main"]["temp_min"],
        "temp_max": data["main"]["temp_max"],
        "pressure": data["main"]["pressure"],
        "humidity": data["main"]["humidity"],
        "weather_main": data["weather"][0]["main"],
        "weather_description": data["weather"][0]["description"],
        "wind_speed": data["wind"]["speed"],
        "wind_deg": data["wind"]["deg"],
        "clouds_all": data["clouds"]["all"],
        "sunrise": data["sys"]["sunrise"],
        "sunset": data["sys"]["sunset"]
    }

def adjust_column_width(ws):
    for col in ws.columns:
        max_length = 0
        column = col[0].column_letter
        for cell in col:
            try:
                if len(str(cell.value)) > max_length:
                    max_length = len(cell.value)
            except:
                pass
        adjusted_width = (max_length + 2)
        ws.column_dimensions[column].width = adjusted_width

def write_to_excel(data, file_name="weather_data.xlsx"):
    if os.path.exists(file_name):
        wb = load_workbook(file_name)
        ws = wb.active
    else:
        wb = Workbook()
        ws = wb.active
        ws.title = "Weather Data"
        headers = ["日付", "都市", "気温", "体感気温", "最低気温", "最高気温",
                   "気圧", "湿度", "天気", "天気詳細",
                   "風速", "風向", "雲量", "日の出", "日の入り"]
        for col_num, header in enumerate(headers, 1):
            col_letter = get_column_letter(col_num)
            ws[f"{col_letter}1"] = header
            ws[f"{col_letter}1"].font = Font(bold=True)
    
    values = [
        [data["date"], data["city"], data["temperature"], data["feels_like"], data["temp_min"],
         data["temp_max"], data["pressure"], data["humidity"], data["weather_main"],
         data["weather_description"], data["wind_speed"], data["wind_deg"],
         data["clouds_all"], data["sunrise"], data["sunset"]]
    ]
    for row in values:
        ws.append(row)
    
    adjust_column_width(ws)
    
    wb.save(file_name)
    print(f"Data written to {file_name}")

def weather_to_speech(data, file_name="weather_data.mp3"):
    text = f"""天気情報:
    日付: {data['date']}
    都市: {data['city']}
    気温: {data['temperature']}度
    体感気温: {data['feels_like']}度
    最低気温: {data['temp_min']}度
    最高気温: {data['temp_max']}度
    気圧: {data['pressure']}ヘクトパスカル
    湿度: {data['humidity']}パーセント
    天気: {data['weather_main']}
    天気詳細: {data['weather_description']}
    風速: {data['wind_speed']}メートル毎秒
    風向: {data['wind_deg']}度
    雲量: {data['clouds_all']}パーセント
    日の出: {data['sunrise']}
    日の入り: {data['sunset']}
    """
    
    tts = gTTS(text=text, lang='ja')
    tts.save(file_name)
    print(f"Speech data saved as {file_name}")

def weather_to_pdf(data, file_name="weather_data.pdf"):
    pdf = FPDF()
    pdf.add_page()
    pdf.add_font("IPAGothic", "", "ipag.ttf", uni=True)
    pdf.set_font("IPAGothic", size=12)
    
    pdf.cell(200, 10, txt="天気情報", ln=True, align='C')
    pdf.cell(200, 10, txt=f"日付: {data['date']}", ln=True)
    pdf.cell(200, 10, txt=f"都市: {data['city']}", ln=True)
    pdf.cell(200, 10, txt=f"気温: {data['temperature']}度", ln=True)
    pdf.cell(200, 10, txt=f"体感気温: {data['feels_like']}度", ln=True)
    pdf.cell(200, 10, txt=f"最低気温: {data['temp_min']}度", ln=True)
    pdf.cell(200, 10, txt=f"最高気温: {data['temp_max']}度", ln=True)
    pdf.cell(200, 10, txt=f"気圧: {data['pressure']}ヘクトパスカル", ln=True)
    pdf.cell(200, 10, txt=f"湿度: {data['humidity']}パーセント", ln=True)
    pdf.cell(200, 10, txt=f"天気: {data['weather_main']}", ln=True)
    pdf.cell(200, 10, txt=f"天気詳細: {data['weather_description']}", ln=True)
    pdf.cell(200, 10, txt=f"風速: {data['wind_speed']}メートル毎秒", ln=True)
    pdf.cell(200, 10, txt=f"風向: {data['wind_deg']}度", ln=True)
    pdf.cell(200, 10, txt=f"雲量: {data['clouds_all']}パーセント", ln=True)
    pdf.cell(200, 10, txt=f"日の出: {data['sunrise']}", ln=True)
    pdf.cell(200, 10, txt=f"日の入り: {data['sunset']}", ln=True)
    
    pdf.output(file_name)
    print(f"PDF data saved as {file_name}")

if __name__ == "__main__":
    api_key = "取得したAPIキーを入れる"
    city = "Tokyo"
    
    weather_data = get_weather_data(api_key, city)
    
    weather_data["date"] = datetime.datetime.fromtimestamp(weather_data["date"]).strftime('%Y-%m-%d %H:%M:%S')
    weather_data["sunrise"] = datetime.datetime.fromtimestamp(weather_data["sunrise"]).strftime('%Y-%m-%d %H:%M:%S')
    weather_data["sunset"] = datetime.datetime.fromtimestamp(weather_data["sunset"]).strftime('%Y-%m-%d %H:%M:%S')
    
    write_to_excel(weather_data)
    weather_to_speech(weather_data)
    weather_to_pdf(weather_data)

カスタマイズ:天気と天気の詳細の結果も日本語表記

天気情報の詳細を日本語表記にするためには、APIから取得した英語の情報を日本語に変換する必要があります。以下の例では、一般的な天気情報の英語表記を日本語に変換するマッピングを追加します。

import requests
import datetime
from openpyxl import Workbook, load_workbook
from openpyxl.utils import get_column_letter
from openpyxl.styles import Font
import os
from gtts import gTTS
from fpdf import FPDF

def get_weather_data(api_key, city):
    url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}&units=metric"
    response = requests.get(url)
    data = response.json()
    return {
        "date": data["dt"],
        "city": data["name"],
        "temperature": data["main"]["temp"],
        "feels_like": data["main"]["feels_like"],
        "temp_min": data["main"]["temp_min"],
        "temp_max": data["main"]["temp_max"],
        "pressure": data["main"]["pressure"],
        "humidity": data["main"]["humidity"],
        "weather_main": data["weather"][0]["main"],
        "weather_description": data["weather"][0]["description"],
        "wind_speed": data["wind"]["speed"],
        "wind_deg": data["wind"]["deg"],
        "clouds_all": data["clouds"]["all"],
        "sunrise": data["sys"]["sunrise"],
        "sunset": data["sys"]["sunset"]
    }

def translate_weather(weather_main, weather_description):
    weather_main_dict = {
        "Clear": "晴天",
        "Clouds": "曇り",
        "Rain": "雨",
        "Drizzle": "霧雨",
        "Thunderstorm": "雷雨",
        "Snow": "雪",
        "Mist": "霧",
        "Smoke": "煙",
        "Haze": "もや",
        "Dust": "ほこり",
        "Fog": "霧",
        "Sand": "砂",
        "Ash": "灰",
        "Squall": "スコール",
        "Tornado": "竜巻"
    }
    
    weather_description_dict = {
        "clear sky": "快晴",
        "few clouds": "少しの雲",
        "scattered clouds": "散在する雲",
        "broken clouds": "壊れた雲",
        "overcast clouds": "曇り",
        "shower rain": "にわか雨",
        "rain": "雨",
        "thunderstorm": "雷雨",
        "snow": "雪",
        "mist": "霧"
    }
    
    weather_main_jp = weather_main_dict.get(weather_main, weather_main)
    weather_description_jp = weather_description_dict.get(weather_description, weather_description)
    
    return weather_main_jp, weather_description_jp

def adjust_column_width(ws):
    for col in ws.columns:
        max_length = 0
        column = col[0].column_letter
        for cell in col:
            try:
                if len(str(cell.value)) > max_length:
                    max_length = len(cell.value)
            except:
                pass
        adjusted_width = (max_length + 2)
        ws.column_dimensions[column].width = adjusted_width

def write_to_excel(data, file_name="weather_data.xlsx"):
    if os.path.exists(file_name):
        wb = load_workbook(file_name)
        ws = wb.active
    else:
        wb = Workbook()
        ws = wb.active
        ws.title = "Weather Data"
        headers = ["日付", "都市", "気温", "体感気温", "最低気温", "最高気温",
                   "気圧", "湿度", "天気", "天気詳細",
                   "風速", "風向", "雲量", "日の出", "日の入り"]
        for col_num, header in enumerate(headers, 1):
            col_letter = get_column_letter(col_num)
            ws[f"{col_letter}1"] = header
            ws[f"{col_letter}1"].font = Font(bold=True)
    
    values = [
        [data["date"], data["city"], data["temperature"], data["feels_like"], data["temp_min"],
         data["temp_max"], data["pressure"], data["humidity"], data["weather_main"],
         data["weather_description"], data["wind_speed"], data["wind_deg"],
         data["clouds_all"], data["sunrise"], data["sunset"]]
    ]
    for row in values:
        ws.append(row)
    
    adjust_column_width(ws)
    
    wb.save(file_name)
    print(f"Data written to {file_name}")

def weather_to_speech(data, file_name="weather_data.mp3"):
    text = f"""天気情報:
    日付: {data['date']}
    都市: {data['city']}
    気温: {data['temperature']}度
    体感気温: {data['feels_like']}度
    最低気温: {data['temp_min']}度
    最高気温: {data['temp_max']}度
    気圧: {data['pressure']}ヘクトパスカル
    湿度: {data['humidity']}パーセント
    天気: {data['weather_main']}
    天気詳細: {data['weather_description']}
    風速: {data['wind_speed']}メートル毎秒
    風向: {data['wind_deg']}度
    雲量: {data['clouds_all']}パーセント
    日の出: {data['sunrise']}
    日の入り: {data['sunset']}
    """
    
    tts = gTTS(text=text, lang='ja')
    tts.save(file_name)
    print(f"Speech data saved as {file_name}")

def weather_to_pdf(data, file_name="weather_data.pdf"):
    pdf = FPDF()
    pdf.add_page()
    pdf.add_font("IPAGothic", "", "ipag.ttf", uni=True)
    pdf.set_font("IPAGothic", size=12)
    
    pdf.cell(200, 10, txt="天気情報", ln=True, align='C')
    pdf.cell(200, 10, txt=f"日付: {data['date']}", ln=True)
    pdf.cell(200, 10, txt=f"都市: {data['city']}", ln=True)
    pdf.cell(200, 10, txt=f"気温: {data['temperature']}度", ln=True)
    pdf.cell(200, 10, txt=f"体感気温: {data['feels_like']}度", ln=True)
    pdf.cell(200, 10, txt=f"最低気温: {data['temp_min']}度", ln=True)
    pdf.cell(200, 10, txt=f"最高気温: {data['temp_max']}度", ln=True)
    pdf.cell(200, 10, txt=f"気圧: {data['pressure']}ヘクトパスカル", ln=True)
    pdf.cell(200, 10, txt=f"湿度: {data['humidity']}パーセント", ln=True)
    pdf.cell(200, 10, txt=f"天気: {data['weather_main']}", ln=True)
    pdf.cell(200, 10, txt=f"天気詳細: {data['weather_description']}", ln=True)
    pdf.cell(200, 10, txt=f"風速: {data['wind_speed']}メートル毎秒", ln=True)
    pdf.cell(200, 10, txt=f"風向: {data['wind_deg']}度", ln=True)
    pdf.cell(200, 10, txt=f"雲量: {data['clouds_all']}パーセント", ln=True)
    pdf.cell(200, 10, txt=f"日の出: {data['sunrise']}", ln=True)
    pdf.cell(200, 10, txt=f"日の入り: {data['sunset']}", ln=True)
    
    pdf.output(file_name)
    print(f"PDF data saved as {file_name}")

if __name__ == "__main__":
    api_key = "取得したAPIキーを入れる"
    city = "Tokyo"
    
    weather_data = get_weather_data(api_key, city)
    
    weather_data["date"] = datetime.datetime.fromtimestamp(weather_data["date"]).strftime('%Y-%m-%d %H:%M:%S')
    weather_data["sunrise"] = datetime.datetime.fromtimestamp(weather_data["sunrise"]).strftime('%Y-%m-%d %H:%M:%S')
    weather_data["sunset"] = datetime.datetime.fromtimestamp(weather_data["sunset"]).strftime('%Y-%m-%d %H:%M:%S')
    
    # Translate weather details to Japanese
    weather_data["weather_main"], weather_data["weather_description"] = translate_weather(weather_data["weather_main"], weather_data["weather_description"])
    
    write_to_excel(weather_data)
    weather_to_speech(weather_data)
    weather_to_pdf(weather_data)

日本語に翻訳するためにtranslate_weather関数を追加しました。これにより、Excelファイル、音声ファイル、およびPDFファイルに日本語の天気情報が含まれるようになります。

APIから取得した英語の情報全てを日本語に変換

対応する翻訳辞書を作成し、それを使用して英語から日本語に変換します。以下のスクリプトでは、天気情報のすべてのフィールドを日本語に変換するための辞書を追加し、翻訳を行うように修正

import requests
import datetime
from openpyxl import Workbook, load_workbook
from openpyxl.utils import get_column_letter
from openpyxl.styles import Font
import os
from gtts import gTTS
from fpdf import FPDF

def get_weather_data(api_key, city):
    url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}&units=metric"
    response = requests.get(url)
    data = response.json()
    return {
        "date": data["dt"],
        "city": data["name"],
        "temperature": data["main"]["temp"],
        "feels_like": data["main"]["feels_like"],
        "temp_min": data["main"]["temp_min"],
        "temp_max": data["main"]["temp_max"],
        "pressure": data["main"]["pressure"],
        "humidity": data["main"]["humidity"],
        "weather_main": data["weather"][0]["main"],
        "weather_description": data["weather"][0]["description"],
        "wind_speed": data["wind"]["speed"],
        "wind_deg": data["wind"]["deg"],
        "clouds_all": data["clouds"]["all"],
        "sunrise": data["sys"]["sunrise"],
        "sunset": data["sys"]["sunset"]
    }

def translate_weather_data(data):
    translations = {
        "date": "日付",
        "city": "都市",
        "temperature": "気温",
        "feels_like": "体感気温",
        "temp_min": "最低気温",
        "temp_max": "最高気温",
        "pressure": "気圧",
        "humidity": "湿度",
        "weather_main": "天気",
        "weather_description": "天気詳細",
        "wind_speed": "風速",
        "wind_deg": "風向",
        "clouds_all": "雲量",
        "sunrise": "日の出",
        "sunset": "日の入り",
        "Clear": "晴天",
        "Clouds": "曇り",
        "Rain": "雨",
        "Drizzle": "霧雨",
        "Thunderstorm": "雷雨",
        "Snow": "雪",
        "Mist": "霧",
        "Smoke": "煙",
        "Haze": "もや",
        "Dust": "ほこり",
        "Fog": "霧",
        "Sand": "砂",
        "Ash": "灰",
        "Squall": "スコール",
        "Tornado": "竜巻",
        "clear sky": "快晴",
        "few clouds": "少しの雲",
        "scattered clouds": "散在する雲",
        "broken clouds": "壊れた雲",
        "overcast clouds": "曇り",
        "shower rain": "にわか雨",
        "rain": "雨",
        "thunderstorm": "雷雨",
        "snow": "雪",
        "mist": "霧"
    }
    
    translated_data = {}
    for key, value in data.items():
        translated_key = translations.get(key, key)
        if isinstance(value, str):
            translated_value = translations.get(value, value)
        else:
            translated_value = value
        translated_data[translated_key] = translated_value

    return translated_data

def adjust_column_width(ws):
    for col in ws.columns:
        max_length = 0
        column = col[0].column_letter
        for cell in col:
            try:
                if len(str(cell.value)) > max_length:
                    max_length = len(cell.value)
            except:
                pass
        adjusted_width = (max_length + 2)
        ws.column_dimensions[column].width = adjusted_width

def write_to_excel(data, file_name="weather_data.xlsx"):
    if os.path.exists(file_name):
        wb = load_workbook(file_name)
        ws = wb.active
    else:
        wb = Workbook()
        ws = wb.active
        ws.title = "Weather Data"
        headers = list(data.keys())
        for col_num, header in enumerate(headers, 1):
            col_letter = get_column_letter(col_num)
            ws[f"{col_letter}1"] = header
            ws[f"{col_letter}1"].font = Font(bold=True)
    
    values = [list(data.values())]
    for row in values:
        ws.append(row)
    
    adjust_column_width(ws)
    
    wb.save(file_name)
    print(f"Data written to {file_name}")

def weather_to_speech(data, file_name="weather_data.mp3"):
    text = f"""天気情報:
    日付: {data['日付']}
    都市: {data['都市']}
    気温: {data['気温']}度
    体感気温: {data['体感気温']}度
    最低気温: {data['最低気温']}度
    最高気温: {data['最高気温']}度
    気圧: {data['気圧']}ヘクトパスカル
    湿度: {data['湿度']}パーセント
    天気: {data['天気']}
    天気詳細: {data['天気詳細']}
    風速: {data['風速']}メートル毎秒
    風向: {data['風向']}度
    雲量: {data['雲量']}パーセント
    日の出: {data['日の出']}
    日の入り: {data['日の入り']}
    """
    
    tts = gTTS(text=text, lang='ja')
    tts.save(file_name)
    print(f"Speech data saved as {file_name}")

def weather_to_pdf(data, file_name="weather_data.pdf"):
    pdf = FPDF()
    pdf.add_page()
    pdf.add_font("IPAGothic", "", "ipag.ttf", uni=True)
    pdf.set_font("IPAGothic", size=12)
    
    pdf.cell(200, 10, txt="天気情報", ln=True, align='C')
    pdf.cell(200, 10, txt=f"日付: {data['日付']}", ln=True)
    pdf.cell(200, 10, txt=f"都市: {data['都市']}", ln=True)
    pdf.cell(200, 10, txt=f"気温: {data['気温']}度", ln=True)
    pdf.cell(200, 10, txt=f"体感気温: {data['体感気温']}度", ln=True)
    pdf.cell(200, 10, txt=f"最低気温: {data['最低気温']}度", ln=True)
    pdf.cell(200, 10, txt=f"最高気温: {data['最高気温']}度", ln=True)
    pdf.cell(200, 10, txt=f"気圧: {data['気圧']}ヘクトパスカル", ln=True)
    pdf.cell(200, 10, txt=f"湿度: {data['湿度']}パーセント", ln=True)
    pdf.cell(200, 10, txt=f"天気: {data['天気']}", ln=True)
    pdf.cell(200, 10, txt=f"天気詳細: {data['天気詳細']}", ln=True)
    pdf.cell(200, 10, txt=f"風速: {data['風速']}メートル毎秒", ln=True)
    pdf.cell(200, 10, txt=f"風向: {data['風向']}度", ln=True)
    pdf.cell(200, 10, txt=f"雲量: {data['雲量']}パーセント", ln=True)
    pdf.cell(200, 10, txt=f"日の出: {data['日の出']}", ln=True)
    pdf.cell(200, 10, txt=f"日の入り: {data['日の入り']}", ln=True)
    
    pdf.output(file_name)
    print(f"PDF data saved as {file_name}")

if __name__ == "__main__":
    api_key = "取得したAPIキーを入れる"
    city = "Tokyo"
    
    weather_data = get_weather_data(api_key, city)
    
    weather_data["date"] = datetime.datetime.fromtimestamp(weather_data["date"]).strftime('%Y-%m-%d %H:%M:%S')
    weather_data["sunrise"] = datetime.datetime.fromtimestamp(weather_data["sunrise"]).strftime('%Y-%m-%d %H:%M:%S')
    weather_data["sunset"] = datetime.datetime.fromtimestamp(weather_data["sunset"]).strftime('%Y-%m-%d %H:%M:%S')
    
    # Translate all weather details to Japanese
    translated_weather_data = translate_weather_data(weather_data)
    
    write_to_excel(translated_weather_data)
    weather_to_speech(translated_weather_data)
    weather_to_pdf(translated_weather_data)