[〜#〜] this [〜#〜] urlで情報を操作したい。正常に開き、内容を読むことができます。しかし、私が本当にやりたいことは、必要のないものをすべて捨て、保持したいものを操作することです。
文字列を辞書に変換して、繰り返し処理できる方法はありますか?または、そのまま(strタイプ)解析する必要がありますか?
from urllib.request import urlopen
url = 'http://www.quandl.com/api/v1/datasets/FRED/GDP.json'
response = urlopen(url)
print(response.read()) # returns string with info
response.read()
を印刷したときに、b
が文字列の前に付けられていることに気付きました(例__b'{"a":1,..
_)。 「b」はバイトを表し、処理しているオブジェクトのタイプの宣言として機能します。 json.loads('string')
を使用して文字列をdictに変換できることを知っていたので、バイト型を文字列型に変換する必要がありました。これを行うには、utf-8 decode('utf-8')
への応答をデコードしました。文字列型になると、私の問題は解決し、dict
を簡単に反復処理できました。
これが最速であるか、それとも最も「Python的な」方法で書かれているかはわかりませんが、機能し、常に最適化と改善の時間が経ちます。私のソリューションの完全なコード:
_from urllib.request import urlopen
import json
# Get the dataset
url = 'http://www.quandl.com/api/v1/datasets/FRED/GDP.json'
response = urlopen(url)
# Convert bytes to string type and string type to dict
string = response.read().decode('utf-8')
json_obj = json.loads(string)
print(json_obj['source_name']) # prints the string with 'source_name' key
_
代わりにpythonの要求ライブラリを使用することもできます。
import requests
url = 'http://www.quandl.com/api/v1/datasets/FRED/GDP.json'
response = requests.get(url)
dict = response.json()
これで、「dict」をpython辞書のように操作できます。
json
は、Python 3(JSON形式自体はUnicodeテキストに関してのみ定義されます)のUnicodeテキストで動作するため、HTTP応答で受信したバイトをデコードする必要があります。 r.headers.get_content_charset('utf-8')
文字エンコーディングを取得します:
#!/usr/bin/env python3
import io
import json
from urllib.request import urlopen
with urlopen('https://httpbin.org/get') as r, \
io.TextIOWrapper(r, encoding=r.headers.get_content_charset('utf-8')) as file:
result = json.load(file)
print(result['headers']['User-Agent'])
ここでio.TextIOWrapper
を使用する必要はありません:
#!/usr/bin/env python3
import json
from urllib.request import urlopen
with urlopen('https://httpbin.org/get') as r:
result = json.loads(r.read().decode(r.headers.get_content_charset('utf-8')))
print(result['headers']['User-Agent'])
python 3.4で状況が変わったと思います。
print("resp:" + json.dumps(resp.json()))