質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.37%

  • Python 2.7

    1394questions

    Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

英語から日本語への文字列置換の方法

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 1,688

peanuts

score 23

Pythonを勉強中の初心者です。初めてテラテイルで質問させていただきます。

現在Python2.7で天気予報APIのYahoo weatherから天気予報を取得し、
Tweetするプログラムを書いています。

pywapiライブラリを利用しています。
http://99blues.dyndns.org/blog/2011/01/lets_get_weather_6/

取得した予報は英語なため、これを日本語へ置換したいと考えています。
例えば、May→5月、AM Clouds/PM Sun→曇のち晴れ、という感じに置換したいです。

ある程度splitを使って例えば、取得したdateリストの「8 May 2015」をsplitで区切ったリストにして、Mayのみをif文にかけてMay→5月に置換する方法も思いつきましたが、ステップ数がすごいことになると思い、それが一番いい方法だとは思えず。。。もっとスマートに書けないだろうかと悩んでいます。

こういった文字列置換で良い方法を教えて下さい。
よろしくお願いします。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+2

あらかじめ決められた対応表に基づいた置換処理ならば、ルックアップテーブル(LookUp Table)という実装方法がシンプルです。
# -*- coding: utf-8 -*-
MONTH_LUT = {
    'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6,
    # ...
}

def translate(date):
    d, m, y = date.split(' ')
    m = MONTH_LUT[m]
    return '{}年{}月{}日'.format(y, m, d)

jdate = translate('8 May 2015')
print jdate

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/05/09 12:36

    ルックアップテーブルを使って英語→日本語文字列置換が実装できました。
    わかりやすい例示と説明、ありがとうございます!

    キャンセル

+2

日付の変換だけですが、
import datetime
print datetime.datetime.strptime("8 May 2015","%d %b %Y").strftime("%m月%d日")

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/05/09 12:40

    日付や時刻に対応するフォーマット文字列からdatetimeオブジェクトを生成できる、 datetime.strptime() クラスメソッドは知りませんでした。
    日付に関しての変換はこちらを利用して実装したいと思います。
    ありがとうございます。

    キャンセル

checkベストアンサー

+1

英語を日本語へ置換するという質問からは外れますが、
pywapiを使うことに特にこだわらなければ、
予報が日本語で提供されているAPIを使うという手もあります。

コード
# -*- coding: utf-8 -*-
import requests

url = 'http://weather.livedoor.com/forecast/webservice/json/v1'
location_id = 130010  # 東京
response = requests.get(url, params={"city": location_id})
weather_data = response.json()

for forecast in  weather_data['forecasts']:
    print u"{} ({}) {}".format(forecast["dateLabel"],
                               forecast["date"],
                               forecast["telop"])
実行結果
$ python weather.py
今日 (2015-05-09) 曇時々雨
明日 (2015-05-10) 晴時々曇
明後日 (2015-05-11) 晴時々曇
参考
livedoorの天気予報API「Weather Hacks」を使ってみた
お天気Webサービス仕様
Requests: 人間のためのHTTP

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/05/10 01:20

    詳しく分かりやすい回答、とても参考になります。
    massakaiさんのコードや参考URL先の情報を参考にして、日本語の天気APIのWeather Hacksから天気予報情報を取得してみました。YahooWeatherよりも断然扱いやすいと感じました。APIのドキュメントで仕様が詳細まで分かり、仕様の通りに動くというのは大事なことですね。
    元々WeatherHacksは使おうか迷っていたのですが、JSONデータをpythonでどのように扱えばいいのかも分からなかったためpywapiを利用していました。
    今回参考URLとして挙げられていた「Requests: 人間のためのHTTP」が分かりやすく理解が深まりました。
    天気予報情報を取得してTwitterへ投稿するという目的も達成できました。
    感謝いたします。また機会がありましたら、よろしくお願いします!

    キャンセル

+1

日付の変換は、strptime(), strftime()を使うotnさんの方法が良いと思います。

天気の変換は、Yahoo! Weather APIの天気は数が限られているので、
ルックアップテーブルを使うyohhoyさんの方法でできます。
Condition Codes

# coding: utf-8
from datetime import datetime

# ルックアップテーブル
CONDITION_TABLE = {u'30': '晴れときどきくもり',
                   u'33': '快晴'}

# Yahoo! Weather APIのレスポンスの一部
response = {'forecasts': [{'code': u'33',
                           'date': u'10 Jan 2011',
                           'high': u'5',
                           'low': u'0',
                           'text': u'Mostly Clear'},
                          {'code': u'30',
                           'date': u'11 Jan 2011',
                           'high': u'7',
                           'low': u'2',
                           'text': u'Partly Cloudy'}]}

for forecast in response['forecasts']:
    date = datetime.strptime(forecast['date'],
                             '%d %b %Y').strftime('%Y年%m月%d日')
    condition = CONDITION_TABLE[forecast['code']]

    print '{} {}'.format(date, condition)

実行結果
$ python weather.py
2011年01月10日 快晴
2011年01月11日 晴れときどきくもり

文字列置換を勉強するのであれば、正規表現についても調べてみると良いと思います。
7.2. re — 正規表現操作 — Python 2.7ja1 documentation

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/05/09 12:56

    具体的な実装方法の例示、ありがとうございます。大変参考になります。
    Condition Codesのコード、確認したのですが
    code対応表ではcode:39→scattered thunderstorms(ところにより雷雨)ですが、
    実際に受け取ったものは
    'forecasts' ['code':39, ... ,'text': u'PM Showers'] なのです。
    ということは、辞書を作るとすれば
    'Clear': u'晴れ(晴天) '
    というように、受け取った'text'に対応させる他ないですよね。
    ただ、受け取ったテキストは'text'は「Rain/Wind」「AM Showers」「PM Showers」のように、午前中のみ、午後のみだったり、複数の天候をスラッシュで連結させたりで種類は多数あるように思います。
    こうなると、全てルックアップテーブルで対応するのは難しいですよね。

    いろいろ考えているのですが、なかなかイイ案が思いつきません。

    キャンセル

  • 2015/05/09 20:06

    複数のcodeが同じdescriptionだったり、codeと異なる天気が返ってきているので
    Condition Codesのドキュメントはあまりメンテされていないのかもしれません。

    {'Rain': '雨', 'Showers': 'にわか雨', 'Wind': '風', 'AM': '午前', 'PM': '午後', '/': 'のち'}
    のようなルックアップテーブルをつくれば、それなりに変換できるのですが、
    Yahoo Weatherが使っている天気表現が網羅できないことと、
    天気表現が変更されたときにテーブルが使えなくなるので、
    ルックアップテーブルで対応するよりも日本語のAPIを使ったほうが楽だと思いました。
    ルックアップテーブルを使うのは

    キャンセル

同じタグがついた質問を見る

  • Python 2.7

    1394questions

    Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。