2016-09-28 35 views
0

.jsonは、多くの都市/国を含むstringに変換されています。入力に応じて文字列の特定の部分を抽出する

ユーザーの国の選択に応じて、市の情報を抽出したいと考えています(ロンドンは単なる例です)。ユーザーをinputed Country場合例えば

は、だった: UK、以下の情報は、文字列から抽出されるだろう:私はおそらく私の未熟さに、この原因を達成できるかにあまりにもわからないんだけど

if文が必要であることを認識しています。これまでの私の進捗状況:

Country = raw_input('Country: ') 
if 'UK' in string: 
    ??? 
+0

JSONモジュールを使用してJSONを解析する方法を知っていますか? – FamousJameous

+0

@FamousJameous Hmm、いいえ、私は一見を持っているでしょう。 – ThatOnePythonNoob

+0

今後の参考のためのリンクは次のとおりです。https://docs.python.org/2.7/library/json.html – FamousJameous

答えて

1

私たちのうちのいくつかが未加工のJSONを見落としたため、最初の応答はあまり大きくありませんでした。しかし、でしたので、あなたが示したスニペットがより完全な(そして有効な)対応を持っていることをより明白にする方がよいでしょう。

import json 

json_string = """{ 
    "response": { 
    "version":"0.1", 
    "termsofService":"http://www.wunderground.com/weather/api/d/terms.html", 
    "features": { 
    "conditions": 1 
    } 
     , "results": [ 
     { 
     "name": "London", 
     "city": "London", 
     "state": "AR", 
     "country": "US", 
     "country_iso3166":"US", 
     "country_name":"USA", 
     "zmw": "72847.1.99999", 
     "l": "https://stackoverflow.com/q/zmw:72847.1.99999" 
     } 
     , 
     { 
     "name": "London", 
     "city": "London", 
     "state": "KY", 
     "country": "US", 
     "country_iso3166":"US", 
     "country_name":"USA", 
     "zmw": "40741.1.99999", 
     "l": "https://stackoverflow.com/q/zmw:40741.1.99999" 
     } 
     , 
     { 
     "name": "London", 
     "city": "London", 
     "state": "MN", 
     "country": "US", 
     "country_iso3166":"US", 
     "country_name":"USA", 
     "zmw": "56036.3.99999", 
     "l": "https://stackoverflow.com/q/zmw:56036.3.99999" 
     } 
     , 
     { 
     "name": "London", 
     "city": "London", 
     "state": "OH", 
     "country": "US", 
     "country_iso3166":"US", 
     "country_name":"USA", 
     "zmw": "43140.1.99999", 
     "l": "https://stackoverflow.com/q/zmw:43140.1.99999" 
     } 
     , 
     { 
     "name": "London", 
     "city": "London", 
     "state": "ON", 
     "country": "CA", 
     "country_iso3166":"CA", 
     "country_name":"Canada", 
     "zmw": "00000.1.71623", 
     "l": "https://stackoverflow.com/q/zmw:00000.1.71623" 
     } 
     , 
     { 
     "name": "London", 
     "city": "London", 
     "state": "TX", 
     "country": "US", 
     "country_iso3166":"US", 
     "country_name":"USA", 
     "zmw": "76854.1.99999", 
     "l": "https://stackoverflow.com/q/zmw:76854.1.99999" 
     } 
     , 
     { 
     "name": "London", 
     "city": "London", 
     "state": "", 
     "country": "UK", 
     "country_iso3166":"GB", 
     "country_name":"United Kingdom", 
     "zmw": "00000.1.03772", 
     "l": "https://stackoverflow.com/q/zmw:00000.1.03772" 
     } 
     , 
     { 
     "name": "London", 
     "city": "London", 
     "state": "WV", 
     "country": "US", 
     "country_iso3166":"US", 
     "country_name":"USA", 
     "zmw": "25126.1.99999", 
     "l": "https://stackoverflow.com/q/zmw:25126.1.99999" 
     } 
     ] 
    } 
}""" 

json_object = json.loads(json_string) 

world_dict = {} 
for item in json_object['response']['results']: 
    item_country = item['country'] 
    in_dict = world_dict.get(item_country) 
    if in_dict: 
     world_dict[item_country].extend([item]) 
    else: 
     world_dict[item_country] = [item] 

country = raw_input('Country: ') 

response = world_dict.get(country) 
if response: 
    for item in response: 
     print item 
else: 
    print "Not a valid country" 

EDIT: むしろJSON文字列よりも、URLを使用するようにコメントに基づいて、私は辞書にデータをロードしてのような何かをするだろう、と述べた

import requests 

url = 'http://api.wunderground.com/api/a8c3e5ce8970ae66/conditions/q/London.json' 

data = requests.get(url).json() 


world_dict = {} 
for item in data['response']['results']: 
    item_country = item['country'] 
    in_dict = world_dict.get(item_country) 
    if in_dict: 
     world_dict[item_country].extend([item]) 
    else: 
     world_dict[item_country] = [item] 

country = raw_input('Country: ') 

response = world_dict.get(country) 
if response: 
    for item in response: 
     print item 
else: 
    print "Not a valid country" 
+0

本当にありがとうございました!お待ち頂きまして、ありがとうございます!コードは素晴らしい作品です! – ThatOnePythonNoob

+1

@ThatOnePythonNoobあなたは大歓迎です:)間違った国名を拒否するように更新しました。以前の困難に惑わされてはいけません。私が言ったように、あなたは正確なjson構造を投稿していますが、一番下に正しいものがあり、上に無効なスニペットがあります。このコードがあなたの問題を解決した場合は、他の人がまだ答えられていないと思わないように、あなたはそれを正しくマークしていただきたいと思います。 – roganjosh

+0

'json_string'をAPIリンク(http://api.wunderground.com/api/a8c3e5ce8970ae66/conditions/q/London.json)に変更して文字列に変換できますか?プログラムはまだ動作しますか? – ThatOnePythonNoob

0
import json 

country = raw_input('Country: ') 

jsondata = "the large json string mentioned in your post" 

info = json.loads(jsondata) 

for item in info: 
    if item['country'] == country: 
     print item 
+0

info ['results'] 'のアイテムではありませんか? – roganjosh

+0

@ジョンゴードン、それは文字通り10000行を印刷しました – ThatOnePythonNoob

+0

それから、あなたが望む情報だけに制限してください: 'item '[' name ']、item [' city ']、item [' state ']など... ' –

0

あなたはこれを試すことができます。コード内のユーザー入力エラーを考慮する必要があるかもしれません。たとえば、str.strip()や大文字と小文字を区別します。

import json 
input_country = raw_input('Please enter country:') 
with open('London.json') as fp: 
    london_json = fp.read() 
    london = json.loads(london_json) 
    for item in london["response"]["results"]: 
     if item['country'] == input_country: 
      print json.dumps(item, indent = 2) 
+0

提案ありがとう! IOError:[Errno 2]このようなファイルやディレクトリはありません: 'http://api.wunderground.com/api/a8c3e5ce8970ae66/conditions/q/London.json'アイデア? – ThatOnePythonNoob

+0

'open()'はローカルURLファイルではなくローカルファイルでのみ動作します。 –

関連する問題