取得データをPDF(日本語)で書き出すpythonコード
Contents
必要なライブラリのインストール
Pythonのfpdf2
ライブラリを使用します。このライブラリを使ってデータをPDFファイルに書き出します。
pip install gtts fpdf2
日本語を使用する場合フォントファイルをダウンロード
日本語をサポートするフォントファイル(例: ipag.ttf
)をダウンロードして、スクリプトと同じディレクトリに保存します。ipag.ttf
はIPAフォントからダウンロードできます。
ダウンロード手順:
- IPAフォントの公式サイトにアクセスします。
- “IPAexフォント"または"IPAPフォント"を選択し、ダウンロードします。
- ダウンロードした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)
ディスカッション
コメント一覧
まだ、コメントがありません