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

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

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

[DSX](https://datascience.ibm.com/) にログインして、Data Service からコンテナへ書き込むための認証情報を探しても、どこにもありません。 しかし、[Bluemix PaaS](https://console.ng.bluemix.net/) からログインして、オブジェクト・ストレージの情報を探していくことで、コンテナの認証情報を得ることができます。

サービスのリストから、DSX-ObjectStorage へ進んでいきます。
![スクリーンショット 2017-04-20 14.00.23.png](https://qiita-image-store.s3.amazonaws.com/0/42829/bd9fd62c-7cb7-0c2f-8133-182f57ca69fa.png)

DSX-ObjectStorage サービス資格情報を表示すると コンテナごと、つまり、プロジェクトごとに、サービス資格情報が作成されていますから、該当するコンテナのサービス資格情報をDSXのNotebookにコピペして利用します。
![スクリーンショット 2017-04-20 14.09.15.png](https://qiita-image-store.s3.amazonaws.com/0/42829/082fd30c-4da6-a3de-2957-8cf2d8ee0950.png)

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

~~~py: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)の２次元配列
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ファイルの先頭行に挿入されます。次にファイル名（オブジェクト・ストレージのコンテナに格納されるオブジェクト名）となります。

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

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