Watson Data Platform の中核サービスの一つ Data Science Experience (以下DSX) の Notebook上の Pythonコードから、オブジェクト・ストレージ上のファイルを読み出す方法についての忘備録で、DSX オブジェクトストレージからのCSVデータの読込み Python コードの続編で、今度は書き込む側のコードです。
前回の読み込みの場合には、読み込むためのデータが明確で、そのデータから認証情報を取得していただのですが、今度は計算処理の結果を描き込む目的ですから、プロジェクトに対応したコンテナは存在していても、ファイル名から認証情報を得ることができません。ではどうすれば良いでしょうか?
DSX にログインして、Data Service からコンテナへ書き込むための認証情報を探しても、どこにもありません。 しかし、Bluemix PaaS からログインして、オブジェクト・ストレージの情報を探していくことで、コンテナの認証情報を得ることができます。
サービスのリストから、DSX-ObjectStorage へ進んでいきます。
DSX-ObjectStorage サービス資格情報を表示すると コンテナごと、つまり、プロジェクトごとに、サービス資格情報が作成されていますから、該当するコンテナのサービス資格情報をDSXのNotebookにコピペして利用します。
このBluemix 側のサービス資格情報にはコンテナ名が入っていませんから、その部分だけ手作業で追加して、これで準備完了です。
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 が入ります。 それ以外は失敗となります。