Как скачать CSV-файл из ведра, а затем использовать в функции? - PullRequest
0 голосов
/ 23 мая 2019

Здравствуйте, у меня есть один CSV-файл, хранящийся в корзине, я хотел бы использовать этот файл в облачной функции, поэтому мне нужно скачать он и затем использует этот файл в процессе следующим образом:

def plot(event, context):
    client = storage.Client()
    df = pd.read_csv('call_conversations.csv', index_col=0)
    objects = df['filepart']
    y_pos = np.arange(len(objects))
    performance = df['confidence']
    plt.bar(y_pos, performance, align='center', alpha=0.99,color='blue')
    plt.xticks(y_pos, objects,rotation=90)
    plt.ylabel('Confianza') 
    plt.title('')
    plt.savefig('cloud.png')
    print('successfull')

Я пытался с:

def plot(event, context):
    client = storage.Client()

Здесь я успешно получаю CSV-файл в виде строки,

    csv = client.bucket(event['bucket']).blob(event['name']).download_as_string()
    df = pd.read_csv(csv, index_col=0)
    objects = df['filepart']
    y_pos = np.arange(len(objects))
    performance = df['confidence']
    plt.bar(y_pos, performance, align='center', alpha=0.99,color='blue')
    plt.xticks(y_pos, objects,rotation=90)
    plt.ylabel('Confianza') 
    plt.title('Nivel de Confianza Transcripciones')
    plt.savefig('cloud.png')
    print('successfull')

однако я получил:

  File "local.py", line 67, in <module>
    trigger()
  File "local.py", line 64, in trigger
    plot(event,None)
  File "local.py", line 49, in plot
    df = pd.read_csv(csv, index_col=0)
  File "/home/adolfo/.local/lib/python3.6/site-packages/pandas/io/parsers.py", line 702, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "/home/adolfo/.local/lib/python3.6/site-packages/pandas/io/parsers.py", line 429, in _read
    parser = TextFileReader(filepath_or_buffer, **kwds)
  File "/home/adolfo/.local/lib/python3.6/site-packages/pandas/io/parsers.py", line 895, in __init__
    self._make_engine(self.engine)
  File "/home/adolfo/.local/lib/python3.6/site-packages/pandas/io/parsers.py", line 1122, in _make_engine
    self._engine = CParserWrapper(self.f, **self.options)
  File "/home/adolfo/.local/lib/python3.6/site-packages/pandas/io/parsers.py", line 1853, in __init__
    self._reader = parsers.TextReader(src, **kwds)
  File "pandas/_libs/parsers.pyx", line 387, in pandas._libs.parsers.TextReader.__cinit__
  File "pandas/_libs/parsers.pyx", line 725, in pandas._libs.parsers.TextReader._setup_parser_source
OSError: Expected file path name or file-like object, got <class 'bytes'> type

Поскольку мне нужно перевести этот код в облачные функции, я бы хотел найти способ загрузить CSV из корзины. и хранить это в памяти, чтобы потом использовать с пандами,

Я также пробовал с: StringIO

def plot(event, context):

    client = storage.Client()
    csv = client.bucket(event['bucket']).blob(event['name']).download_as_string()

    df = pd.read_csv(StringIO(csv), index_col=0)
    objects = df['filepart']
    y_pos = np.arange(len(objects))
    performance = df['confidence']
    plt.bar(y_pos, performance, align='center', alpha=0.99,color='blue')
    plt.xticks(y_pos, objects,rotation=90)
    plt.ylabel('Confianza') 
    plt.title('Nivel de Confianza Transcripciones')
    plt.savefig('cloud.png')
    print('successfull')

Однако я получил:

Traceback (most recent call last):
  File "local.py", line 67, in <module>
    trigger()
  File "local.py", line 64, in trigger
    plot(event,None)
  File "local.py", line 49, in plot
    df = pd.read_csv(StringIO(csv), index_col=0)
TypeError: initial_value must be str or None, not bytes

1 Ответ

2 голосов
/ 24 мая 2019

Проблема заключается в том, что Pandas read_csv() API ожидает чтения имени файла или файла, подобного объекту. При вызове вы передаете строку, считанную с объекта, найденного в корзине. Это означает, что вы уже прочитали контент и хотите проанализировать его в вашем фрейме данных. Я выполнил поиск того, как этого добиться, и нашел следующий рецепт:

Создание Pandas DataFrame из строки

, который, кажется, имеет отличное решение, используя StringIO. Прочитайте эту ссылку, и я надеюсь, что интеграция в ваше собственное решение будет простой.

Если данные являются байтами, мы можем использовать io.BytesIO в качестве источника данных для read_csv(). См. Например:

Замена StringIO, которая работает с байтами вместо строк?

...