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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 2.7

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

Q&A

解決済

4回答

3649閲覧

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

peanuts

総合スコア34

Python 2.7

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

0グッド

0クリップ

投稿2015/05/07 13:44

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月に置換する方法も思いつきましたが、ステップ数がすごいことになると思い、それが一番いい方法だとは思えず。。。もっとスマートに書けないだろうかと悩んでいます。

こういった文字列置換で良い方法を教えて下さい。
よろしくお願いします。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

日付の変換だけですが、

lang

1import datetime 2print datetime.datetime.strptime("8 May 2015","%d %b %Y").strftime("%m月%d日")

投稿2015/05/07 16:45

otn

総合スコア84505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

peanuts

2015/05/09 03:40

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

0

あらかじめ決められた対応表に基づいた置換処理ならば、ルックアップテーブル(LookUp Table)という実装方法がシンプルです。

lang

1# -*- coding: utf-8 -*- 2MONTH_LUT = { 3 'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6, 4 # ... 5} 6 7def translate(date): 8 d, m, y = date.split(' ') 9 m = MONTH_LUT[m] 10 return '{}年{}月{}日'.format(y, m, d) 11 12jdate = translate('8 May 2015') 13print jdate

投稿2015/05/07 15:40

yohhoy

総合スコア6191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

peanuts

2015/05/09 03:36

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

0

ベストアンサー

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

コード

lang

1# -*- coding: utf-8 -*- 2import requests 3 4url = 'http://weather.livedoor.com/forecast/webservice/json/v1' 5location_id = 130010 # 東京 6response = requests.get(url, params={"city": location_id}) 7weather_data = response.json() 8 9for forecast in weather_data['forecasts']: 10 print u"{} ({}) {}".format(forecast["dateLabel"], 11 forecast["date"], 12 forecast["telop"])

実行結果

lang

1$ python weather.py 2今日 (2015-05-09) 曇時々雨 3明日 (2015-05-10) 晴時々曇 4明後日 (2015-05-11) 晴時々曇

参考

投稿2015/05/09 09:17

massakai

総合スコア24

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

peanuts

2015/05/09 16:20

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

0

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

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

lang

1# coding: utf-8 2from datetime import datetime 3 4# ルックアップテーブル 5CONDITION_TABLE = {u'30': '晴れときどきくもり', 6 u'33': '快晴'} 7 8# Yahoo! Weather APIのレスポンスの一部 9response = {'forecasts': [{'code': u'33', 10 'date': u'10 Jan 2011', 11 'high': u'5', 12 'low': u'0', 13 'text': u'Mostly Clear'}, 14 {'code': u'30', 15 'date': u'11 Jan 2011', 16 'high': u'7', 17 'low': u'2', 18 'text': u'Partly Cloudy'}]} 19 20for forecast in response['forecasts']: 21 date = datetime.strptime(forecast['date'], 22 '%d %b %Y').strftime('%Y年%m月%d日') 23 condition = CONDITION_TABLE[forecast['code']] 24 25 print '{} {}'.format(date, condition)

実行結果

lang

1$ python weather.py 22011年01月10日 快晴 32011年01月11日 晴れときどきくもり

文字列置換を勉強するのであれば、正規表現についても調べてみると良いと思います。

投稿2015/05/08 13:30

massakai

総合スコア24

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

peanuts

2015/05/09 03: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」のように、午前中のみ、午後のみだったり、複数の天候をスラッシュで連結させたりで種類は多数あるように思います。 こうなると、全てルックアップテーブルで対応するのは難しいですよね。 いろいろ考えているのですが、なかなかイイ案が思いつきません。
massakai

2015/05/09 11:06

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問