☆☆ 新着記事 ☆☆

2020年5月23日土曜日

PythonでJSONを扱ってみる -テキスト・ロカールファイル・API


JSONとは:
KeyとValueのペア(連想配列、オブジェクト)

例)

let item = {
"id":1,
"name":"N95 Mask",  //文字列は必ず” ” で表記
"available": ["Tokyo", "Osaka"],
"time":{ "quick":"in 3hrs","normal":"in 24hrs", "best effort": "3 days"},
"order":{"Basic":{"hospital":"100 Yen", "retailer":"200 Yen", "consumer":"300Yen"}}
}


{ }で区切るとオブジェクトを表す。
[  ]は配列を表す

各Valueには、ドットでアクセス
console.log(item.available) #  ["Tokyo", "Osaka"]
console.log(item.available[0]) #Tokyo
console.log(item.time) #{quick: "in 3hrs", normal: "in 24hrs", best effort: "3 days"}
console.log(item.time.quick) # in 3hrs
console.log(item.order.basic) #{hospital: "100 Yen"}
console.log(item.order.basic.hospital) #100 Yen

sample jason dataset

people_string='''
{
    "people":[
        {"name":"Wayne Rigsby",
         "phone":"123-456-789",
         "emails":["wayne@cbi.com", "wayne2@cbi.com"],
         "has_license":true},
        {"name":"Patric Jane",
         "phone":"987-654-321",
         "emails":null,
         "has_license":false}
              ]
    }'''


*JSONファイルを辞書として読み込み
json.load()

*辞書をJSON文字列として整形して出力
json.dumps()
区切り文字を指定: 引数separators
デフォルトではキーと値の間が:、要素間が,で区切られる。
print(json.dumps(d, separators=(',', ':')))

インデントを指定: 引数indent
print(json.dumps(d, indent=4))
キーでソート: 引数sort_keys
print(json.dumps(od, sort_keys=True))

Unicodeエスケープ指定: 引数ensure_ascii
print(json.dumps(od, ensure_ascii=False))


*Javascript ObjectをJSONに変換するJS
JSON.stringify(item)

*JSONをJavascript Objectに変換するJS
JSON.perse(item)

1.  jsonフォーマットのテキストデータをjson objectに変換する

import json /// <-標準ライブラリ・インストール不要
data=json.loads(people_string)

print(people_string)だとテキストとしてそのままprintされる
{
    "people":[
        {"name":"Wayne Rigsby",
         "phone":"123-456-789", .....

print(data)だと以下のようなリスト型のjsonフォーマットに変換されていることが確認できる。
    }
{'people': [{'name': 'Wayne Rigsby', 'phone': '123-456-789', 'emails': ['wayne@cbi.com', 'wayne2@cbi.com'], 'has_license': True}, {'name': 'Patric Jane', 'phone': '987-654-321', 'emails': None, 'has_license': False}]}

*リスト型なのでfor loopで取り出せる
for person in data['people']: /// キーで指定
    print(person) ///output1
  print(person['name'])///output2

///output1
{'name': 'Wayne Rigsby', 'phone': '123-456-789', 'emails': ['wayne@cbi.com', 'wayne2@cbi.com'], 'has_license': True}
{'name': 'Patric Jane', 'phone': '987-654-321', 'emails': None, 'has_license': False}

///output2
Wayne Rigsby
Patric Jane

*キーを指定して削除もできる
for person in data['people']:
    del person['phone']
    print(person)

{'name': 'Wayne Rigsby', 'emails': ['wayne@cbi.com', 'wayne2@cbi.com'], 'has_license': True}
{'name': 'Patric Jane', 'emails': None, 'has_license': False}

#辞書型の取り扱いは


2. Pythonオブジェクトをjsonフォーマットのテキストをに変換す


data=json.loads(people_string)
new_string =json.dumps(data)
print(new_string)
{"people": [{"name": "Wayne Rigsby", "phone": "123-456-789", "emails": ["wayne@cbi.com", "wayne2@cbi.com"], "has_license": "true"}, {"name": "Patric Jane", "phone": "987-654-321", "emails": "null", "has_license": "false"}]}

new_string =json.dumps(data, indent=2,sort_keys=True) ///読みやすいようにするオプション
{
  "people": [
    {
      "emails": [
        "wayne@cbi.com",
        "wayne2@cbi.com"
      ],
      "has_license": "true",
      "name": "Wayne Rigsby",
      "phone": "123-456-789"
    },
    {
      "emails": "null",
      "has_license": "false",
      "name": "Patric Jane",
      "phone": "987-654-321"
    }
  ]
}


3.  ローカルのJSONファイルを扱う


jsonファイルはこちら
https://raw.githubusercontent.com/CoreyMSchafer/code_snippets/master/Python-JSON/states.json

{
  "states": [
    {
      "name": "Alabama",
      "abbreviation": "AL",
      "area_codes": ["205", "251", "256", "334", "938"]
    },
    {
      "name": "Alaska",
      "abbreviation": "AK",
      "area_codes": ["907"]
    },....
 ]
}

これをローカルフォルダに置いておく。

(読み込む)
import json

**Python Objectとして開く
with open('states.json') as f:
    data = json.load(f)  /// 先述のjson.loadsと混同しない


for state in data['states']:
    print(state['name'],state['abbreviation'])
Alabama AL
Alaska AK
Arizona AZ......


(新しいJSONファイルとして保存)
with open('states.json') as f:
    data = json.load(f)

for state in data['states']:
    del (state['area_codes'])

with open('new_states.json', w) as f:
     json.dump(data, f, indent=2)


4.  APIで取得されるJSONデータを扱う

(ここで使われているyahoo APIは、現在は利用できない)

import json
from urllib.request import urlopen

with urlopen("https://finance.yahoo.com/webservice/v1/symbols/allcurrencies/quote?format=json") as response:
    source = response.read()

print(source) ///この段階ではタグ情報も一杯。


data = json.loads(source)

# print(json.dumps(data, indent=2))///これで可読な形式に。本当に便利

usd_rates = dict()

"""
APIのJSONは
{
 "list":{
   "meta":{
     "type":"resource-list",
     "start":"0",
     "count"="188"
  },
 "resources":[
   {
     "resource":{
           "classname": "Quote",
           "fields": {
                "name":"USD/KW\RW",
                "price" : "1095.34997"      ...
               }
       }.................

]
と続いていく
////

print(len(data['list'][ "resources"]))
#188

usd_rates = dict()
for item in data['list']['resources']:
    name = item['resource']['fields']['name']
    price = item['resource']['fields']['price']
    usd_rates[name] = price
    usd_name[name] = price   ///nameをキー値、priceをvalueにした辞書作成


print(50 * float(usd_rates['USD/EUR'])) ///50ドルをEURにしてみる。文字列なのでフロートに



こんな例も
#!/usr/bin/env python
try:
    # For Python 3.0 and later
    from urllib.request import urlopen
except ImportError:
    # Fall back to Python 2's urllib2
    from urllib2 import urlopen

import json

def get_jsonparsed_data(url):
    response = urlopen(url)
    data = response.read().decode("utf-8")
    json_data = json.loads(data)
 
   
    return  print(json.dumps(json_data, indent=3))

url = ("https://financialmodelingprep.com/api/v3/stock/gainers?demo")
print(get_jsonparsed_data(url))


0 件のコメント:

コメントを投稿