LoginSignup
1
3

More than 5 years have passed since last update.

DSX オブジェクト・ストレージへCSVデータの書込みのPythonコード

Last updated at Posted at 2017-04-20

Watson Data Platform の中核サービスの一つ Data Science Experience (以下DSX) の Notebook上の Pythonコードから、オブジェクト・ストレージ上のファイルを読み出す方法についての忘備録で、DSX オブジェクトストレージからのCSVデータの読込み Python コードの続編で、今度は書き込む側のコードです。

前回の読み込みの場合には、読み込むためのデータが明確で、そのデータから認証情報を取得していただのですが、今度は計算処理の結果を描き込む目的ですから、プロジェクトに対応したコンテナは存在していても、ファイル名から認証情報を得ることができません。ではどうすれば良いでしょうか?

DSX にログインして、Data Service からコンテナへ書き込むための認証情報を探しても、どこにもありません。 しかし、Bluemix PaaS からログインして、オブジェクト・ストレージの情報を探していくことで、コンテナの認証情報を得ることができます。

サービスのリストから、DSX-ObjectStorage へ進んでいきます。
スクリーンショット 2017-04-20 14.00.23.png

DSX-ObjectStorage サービス資格情報を表示すると コンテナごと、つまり、プロジェクトごとに、サービス資格情報が作成されていますから、該当するコンテナのサービス資格情報をDSXのNotebookにコピペして利用します。
スクリーンショット 2017-04-20 14.09.15.png

このBluemix 側のサービス資格情報にはコンテナ名が入っていませんから、その部分だけ手作業で追加して、これで準備完了です。

python書込み
from io import BytesIO  
import requests
import numpy as np
import json


# オブジェクトストレージの認証情報
credentials_5 = {
  'auth_url':'https://identity.open.softlayer.com',
  'project':'object_storage_bc6cdc85_586e_4581_8a09_8f01f7bdf3ed',
  'project_id':'2a9de4c1d50944a49f1a46dd53394158',
  'region':'dallas',
  'user_id':'********************************',
  'domain_id':'fb119f3e1bc0469dad2b253b317ec7ea',
  'domain_name':'952993',
  'username':'***********************************************',
  'password':"********************",
  'container':'DefaultProjecttakarajpibmcom' <--- 手作業で追加する 
}


def Write_CSV_to_ObjectStorage(credentials, npdata,label, fileName):  
    """This functions returns a StringIO object containing
    the file content from Bluemix Object Storage V3."""

    csvData = ""
    # Label データをCSVの先頭行へ書き込み
    c = 0
    for col in label:
        if c > 0:
            csvData = csvData + ','
        csvData = csvData + col
        c = c + 1
    csvData = csvData + "\n"

    # Numpy配列データを CSV形式テキストデータへ変換
    rows, cols = np.shape(npdata)
    for row in a:
        c = 0
        for col in row:
            if c > 0:
                csvData = csvData + ','
            csvData = csvData + str(col)
            c = c + 1
        csvData = csvData + "\n"

    # オブジェクトストレージ認証
    url1 = ''.join(['https://identity.open.softlayer.com', '/v3/auth/tokens'])
    data = {'auth': {'identity': {'methods': ['password'],
            'password': {'user': {'name': credentials['username'],'domain': {'id': credentials['domain_id']},
            'password': credentials['password']}}}}}
    headers1 = {'Content-Type': 'application/json'}
    resp1 = requests.post(url=url1, data=json.dumps(data), headers=headers1)
    # 認証エラーが発生したら終了
    if resp1.status_code != 201:
        return False, resp1.status_code
    resp1_body = resp1.json()

    # オブジェクトストレージへ書込み
    for e1 in resp1_body['token']['catalog']:
        if(e1['type']=='object-store'):
            for e2 in e1['endpoints']:
                if(e2['interface']=='public'and e2['region']=='dallas'):
                    url2 = ''.join([e2['url'],'/', credentials['container'], '/', fileName])
    s_subject_token = resp1.headers['x-subject-token']
    headers2 = {'X-Auth-Token': s_subject_token, 'accept': 'application/json'}
    resp2 = requests.put(url=url2, headers=headers2, data = csvData )
    result = True
    if resp2.status_code != 201:
        print "ERROR ", resp2.status_code
        result = False
    return result, resp2.status_code


# メイン

# データ生成
x = np.linspace(0,1,60)
y = np.linspace(10,11,60)

# 一本の配列に変更 (x,y)の2次元配列
a = np.stack((x, y), axis=-1)
#print a
# データラベル
label = ["Time","Data"]

# オブジェクトストレージへ保存
rslt = Write_CSV_to_ObjectStorage(credentials_5, a, label,"testDataSet.csv")
print rslt
ew

使い方の解説

第一引数は、認証情報です。 第二引数は、データ配列でnum.pyの配列です、 そして、データ列のラベルでCSVファイルの先頭行に挿入されます。次にファイル名(オブジェクト・ストレージのコンテナに格納されるオブジェクト名)となります。

rslt = Write_CSV_to_ObjectStorage(credentials_5, a, label,"testDataSet.csv")

戻り値は成功すると 201 Created が入ります。 それ以外は失敗となります。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3