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'))