CSV-файл преобразуется в объект io.BytesIO, затем передается в хранилище BLOB-объектов, встречается ошибка типа значения: требуется объект, подобный байту, а не _io.TextIOWrapper

Я пытаюсь передать csv в хранилище BLOB-объектов Azure, CSV создается непосредственно из сценариев Python без локальной копии, у меня есть следующий код, df - это файл CSV:

    with open(df,'w') as f:
       stream = io.BytesIO(f)
       stream.seek(0)
       block_blob_service.create_blob_from_stream('flowshop', 'testdata123', stream)

тогда я получил сообщение об ошибке:

  stream = io.BytesIO(f)  TypeError: a bytes-like object is required, not '_io.TextIOWrapper'

Я думаю, что проблема была в неправильном формате, пожалуйста, определите проблему. Благодарю.

1 ответ

Решение

Вы открыли df для записи, затем попытался передать полученный файловый объект в качестве инициализатора io.BytesIO (который должен принимать фактические двоичные данные, например, b'1234'). Это причина TypeError; открытые файлы (чтение или запись, текстовые или двоичные файлы) не являются bytes или что-нибудь подобное (bytearray, array.array('B'), mmap.mmap и т. д.), так что передавая их io.BytesIO не имеет смысла.

Похоже, ваша цель - читать с df и вам не нужно io.BytesIO на все для этого. Просто измените режим с (текст) записи, 'w' для бинарного чтения, 'rb' , Затем передайте полученный объект файла непосредственно в ваш API:

with open(df, 'rb') as f:
   block_blob_service.create_blob_from_stream('flowshop', 'testdata123', f)

Обновление: видимо df были ваши реальные данные, а не имя файла, чтобы открыть вообще. Учитывая это, вы должны действительно пропустить потоковый API (который не имеет смысла, если данные уже находятся в памяти) и просто использовать bytes основанный API напрямую:

block_blob_service.create_blob_from_bytes('flowshop', 'testdata123', df)

или если df является str не bytes:

block_blob_service.create_blob_from_bytes('flowshop', 'testdata123', df.encode('utf-8'))
Другие вопросы по тегам