2017-02-09 18 views
2

Я пытаюсь написать рамку данных pandas как CSV для хранения объектов Bluemix из ноутбука DSX Python. Я сначала сохраняю dataframe в «локальный» CSV-файл. Затем у меня есть программа, которая пытается записать файл в хранилище объектов. Я получаю 413 ответ - объект слишком большой. Файл составляет всего около 3 МБ. Вот мой код, основанный на примере JSON я нашел здесь: http://datascience.ibm.com/blog/working-with-object-storage-in-data-science-experience-python-edition/Записать csv в хранилище объектов Ibm bluemix из DSX python 2.7 notebook

import requests 

def put_file(credentials, local_file_name): 
    """This function writes file content to Object Storage V3 """ 
    url1 = ''.join(['https://identity.open.softlayer.com', '/v3/auth/tokens']) 
    data = {'auth': {'identity': {'methods': ['password'], 
     'password': {'user': {'name': credentials['name'],'domain': {'id': credentials['domain']}, 
     'password': credentials['password']}}}}} 
    headers = {'Content-Type': 'text/csv'} 
    with open(local_file_name, 'rb') as f: 
     resp1 = requests.post(url=url1, data=f, headers=headers) 
    return resp1 

Любая помощь или указатели очень ценится.

+0

Вы можете принять ответ, который решил вашу проблему, а не просто признать это с комментарием :-) –

ответ

5

Этот фрагмент кода из tutorial работал отлично для меня (для файла размером 12 МБ).

from io import BytesIO 
import requests 
import json 
import pandas as pd 

def put_file(credentials, local_file_name): 
    """This functions returns a StringIO object containing 
    the file content from Bluemix Object Storage V3.""" 
    f = open(local_file_name,'r') 
    my_data = f.read() 
    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/csv'} 
    resp1 = requests.post(url=url1, data=json.dumps(data), headers=headers1) 
    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'], '/', local_file_name]) 
    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 = my_data) 
    print resp2 

Я создал случайную панд dataframe с помощью:

df = pd.DataFrame(np.random.randint(0,100,size=(1000000, 4)), columns=list('ABCD')) 

спас его csv

df.to_csv('myPandasData_1000000.csv',index=False) 

, а затем поместить его в хранилище объектов

put_file(credentials_1,'myPandasData_1000000.csv') 

Вы можете получить credentials_1, нажав insert to code -> Insert credentials для любого объекта в вашем хранилище объектов.

+0

Спасибо @Sumit Goyal - и яйцо на моем лице, я не понял, что образец кода прокручивается и пропустил http PUT раздела кода. Больше кофе нужно ранним утром ... –

+0

@TedMorris Нет проблем :) –

+0

@SumitGoyal привет, я попробовал ваш код, но у меня получилась эта ошибка: KeyError: 'токен' из строки 'для e1 в resp1_body ['token'] ['catalog']: 'у вас есть идея, как это решить? – deltascience