プログラミング Tips

ITエンジニアの雑記ブログ。
IT関連ニュースの考察や、プログラミングに関するTipsの備忘録として…
育児や日常の雑記帳としても、記事を投稿していきます。

プログラミングと日常生活に関する情報を発信しています。

カテゴリ: Python

Python で XMLをJSONへ変換をやってみた!

WEB APIを使っていると、jsonフォーマットのデータ受信が多いが、稀にXMLフォーマットで出力されることがある。

XMLパーサで解析していけばいいが、Jsonに比べて保存時のサイズが大きくなってしまったり、そもそも解析が面倒だったりする…

よって、XMLフォーマットで受け取ったら、それをjsonフォーマットへ一気に変換してくれないか?と思って調査&実験して見たのまとめ。



環境

  • MacOSX 10.13.3
  • Python 3.6.1

準備:"xmltodict" Pythonモジュールのインストール

PyPiからPythonパッケージをインストールする

pip install xmltodict

変換処理

結論からすると、一発変換は困難だったので辞書型を挟んで2ステップ構成となる

  1. XMLを辞書型へ変換
  2. 辞書型をJSONへ変換

1. XMLを辞書型へ変換

# サンプルXMLファイル:
<employees>
    <person>
        <name value="Alice"/>
    </person>
    <person>
        <name value="Bob"/>
    </person>
</employees>
# サンプルXMLファイル
xml = """
<employees>
    <person>
        <name value="Alice"/>
    </person>
    <person>
        <name value="Bob"/>
    </person>
</employees>
"""

dict = xmltodict.parse(xml)
# 辞書型へのアクセス方法

dict['emploees']
dict['emploees']['person']


2. 辞書型をJSONへ変換

import json

result = json.dumps(result, indent=2)
print(result)
# 出力結果
'{
    "employees": {
        "person": [
                {
                    "name": 
                {
                        "@value": "Alice"
                }
            },
            {
                "name": 
                {
                "@value": "Bob"
                }
            }
        ]
    }
}'

これで変換処理完了。



Python を使って RESAS APIを使ってみた!!

官民のビッグデータが、地域経済分析システム(RESAS)として、無償で公開されている。これを利活用するために、Python で使ってみたので、まとめてみた。



地域経済システム(RESAS)とは…

産業の構造や人の流れなどの官民ビッグデータを集約し、可視化するシステム。

このシステムは、地方創生のための様々な取り組みを情報面から支援するために、経済産業省と内閣官房「まち・ひと・しごと創世本部事務局」が提供している。

自治体職員のかたや、地域活性化に関心を持つ様々な分野の肩によって、効果的な施策の立案・実行・検証のためなどに広く利用されている。

RESAS本家のページはこちら

RESAS活用事例はこちら

APIを使って RESASデータをプログラムから活用する為に…

RESASデータをプログラムから取得するためには、APIを用いることになる。
プログラムを介さず、純粋にデータだけを取得することも可能である。

RESASによって、様々なデータがわかりやすく「見える化」されている一方、自分でデータを加工して独自サービスに組み込んだり、複数のデータを組み合わせて分析に活用したいという要望があがり、これを実現するためにAPIが提供されている。

提供されているAPIのドキュメントは、こちらに公開されている。

尚、この利用にはまず無料の利用登録が必須であり、この結果、API利用のための API KEY が発行される。

Python で API を利用してみた!!

APIを利用するための方法は、公式サイトに丁寧な説明が載っているので割愛する。

Python開発環境構築

今回も、virtualenv環境を用いて開発を行うこととし、環境構築方法に関しては以前の投稿に基づいて準備する。

必要モジュールのインストール

HTTPリクエストのために、下記モジュールをインストールする

pip install requests


APIを使って、都道府県一覧を取得!!

コードを以下に掲載

api_key は、無料利用登録から入手可能。
またAPIエンドポイントは、常に固定となり、取得したいデータに応じて

  • APIパス
  • パラメータ

をセットする。

import json
import requests

def resas_api_request():
    # 無料利用登録で入手できるKEY
    api_key = "xxxxxxxxxx"

    # RESAS API エンドポイント
    url  = "https://opendata.resas-portal.go.jp/"
    # APIパス
    url += "api/v1/prefectures"

    #APIレクエストヘッダー
    head={
            "Content-Type":"application/json",
            "X-API-KEY":api_key
        }

    # RESAS APIへのアクセス→取得
    req=requests.get(url, headers=head)

    # レスポンスの出力
    print(req)

    # json形式のレスポンスを読み取り&デコードして日本語変換
    json_obj=json.loads(req._content.decode('utf-8'))

    print(len(json_obj['result']))
    for i in json_obj['result']:
        print(i)

    return

if __name__=="__main__":
    resas_api_request()

以上で、SARESA データがAPIで取得される。

今回は都道府県コード取得のサンプルとしてが、APIパスやパラメータのセットを変更することで他のデータも取得可能になる。

またAPIで取得したデータを複数組み合わせることで、様々な分析が可能になる。

アイデアによっては、RESASアプリコンテストにエントリーして社会貢献することも意義がある活動になるかもしれない。



Python で Redmine RestAPI をコントロール ~インストールと設定~

準備

  • Python 3.6.1
  • "python-redmine"モジュール

インストール

実施環境に、 virtualenv を用いる詳細はここを参照

pip install python-redmine

Redmine でRestAPIを有効にする

管理画面上で"Rest API"の有効チェックボックスをオンにして保存する

Python から Redmineサーバー へのつなぎこみ

Python へ "Python-Redmine" をimportすることでRedmineサーバーへのアクセス準備が整う

from redminelib import Redmine

Redmineサーバーへの繋ぎこみ

redmine = Redmine('https://redmineserver.url')

RedmineサーバーのURLを入力するだけで繋ぎこみは完了!!

Redmine サーバーへの認証

Rest API を用いるためには認証作業が必要
2通りの方法がある

  1. ID, Password
  2. API key
# ID, Pass
redmine = Redmine('https://redmine.url', username='name', password='pass')

# API key
redmine = Redmine('https://redmine.url', key='xxxxxx')

API key はRedmineページにログインして、個人の管理ページ右側ペインボタンをタップすると表示される

Django との親和性

Redmineサーバーへの繋ぎこみの為にコード上に、ID/PassやAPI keyを記述しておくことは推奨しない。例えばDjangoのようなフレームワークを用いた場合、Python-Redminesettings.pyファイルに記述しておくことを推奨する

# settings.py
REDMINE_URL = 'https://redmine.url'
REDMINE_KEY = 'xxxxxxxxxx'
# コード内
from django.conf import settings
from redminelib import Redmine

redmine = Redmine(settings.REDMINE_URL, key=settings.REDMINE_KEY)

次回は、Python-Redmine を用いて関数の使い方をまとめる


Python で日付・時間の間隔を計算してみた!!

Python の datetime モジュールを用いて色々実験してみた。
文字列から日付・時間を生成するとともに、2つの間隔(差)を計算する方法がわからなかったので、調べてみた

前提

  • Python 3.6.1
  • timedateモジュール:日付・時間の管理
  • dateutilモジュール:文字列から日付・時間へ変換

現在の日時を生成する

from datetime import

today = datetime.today()
now = datetime.now()

任意の日時を生成する

from datetime import datetime

d1 = datetime(2018, 1, 1)
d2 = datetime(2018, 2, 1, 12)
d3 = datetime(2018, 3, 1, 11, 15)
d4 = datetime(2018, 4, 1,  5, 30, 59)
d1
datetime.datetime(2018, 1, 1, 0, 0)
d2
datetime.datetime(2018, 2, 1, 12, 0)
d3
datetime.datetime(2018, 3, 1, 11, 15)
d4
datetime.datetime(2018, 4, 1, 5, 30, 59)

文字列を日付・時間に変換

datetimeモジュールのdatetime.strptime() 関数で変換できるが、あまり融通の利くものではないので、dateutilのサブモジュールparser.parser()関数を使う

from dateutil.parser import parse
parse("2017/3/16")
datetime.datetime(2017, 3, 16, 0, 0)

2つの日付・時間を比較

from datetime import datetime, date

d1 = datetime(2017, 12, 5, 8, 25, 10)
d2 = datetime(2016,  5, 11, 12, 10, 10) 

d1 == d2
False
d1 != d2
True
d1 < d2
False
d1 > d2
True

2つの日付・時間の間隔

from datetime import datetime, date

d1 = datetime(2017, 12, 5, 8, 25, 10)
d2 = datetime(2016,  5, 11, 12, 10, 10) 

d1 - d2
datetime.timedelta(572, 72900)

str(d1 - d2)
'572 days, 20:15:00'

# 年数、月数、日数…を個別に計算

from dateutil.relativedelta import relativedelta
delta = relativedelta(d1, d2)
delta
relativedelta(years=+1, months=+6, days=+23, hours=+20, minutes=+15)

delta.years
1

delta.months
6

delta.days
23

Python で csvファイルを読み込む方法を調べてみた!!

Webアプリを開発するにあたって、元データをDBにインポートして上げる必要がある。
今回のデータはcsv形式で存在しているため、そのファイルを読み込んで逐次DBに登録して行く。

まずはPythonでのファイル操作を習得するために、csvファイルを読み込んで逐次出力してみた


環境

  • Python 3.6.1
  • csvファイル "sample.csv"

今回は特にサードパーティモジュールをインストールする必要なく、標準ライブラリだけで実現することができた。もっとスマートに実現する方法はあるかもしれないが…まずは基本に忠実に…ということで…

実行

以下のコマンドを実行する

import codecs
 
fin = codecs.open('test.csv', 'r', 'shift_jis')
 
for line in fin:
    contents = line[:-2].split(',')
    print(contents)

このプログラムには2つの条件が含まれている

  1. 日本語を含むデータの展開
  2. 区切り文字は ','
  3. 改行コードは 'CR''LF'の2バイト構成

1.に関して、"codec"モジュールを用いて、文字コード指定で展開

fin = codecs.open('test.csv', 'r', 'shift_jis')

これは、"Shift-JIS"コードで記述されたファイルを"r"(読取り専用モード)で開くという意味

2.に関して、同一データを","単位で区切る

contents = line[:-2].split(',')

改行コード単位で"line"変数に値を取得できるが、この場合の改行コードは2バイト構成のため、"[:-2]"で改行コードを削除した構成にしている。更にsplit(',')で、データを","単位で分割し配列内に格納する

3.行末コードは"CR""LF"の2バイト構成になっている

Windows環境でファイルを生成すると、このように2バイト文字は異なる。MacOSX, Linuxではライン末尾に付与するコードは若干異なるので注意が必要


↑このページのトップヘ

-->