csv file convert to io.BytesIO object, then stream to blob storage ,meets value type error:a bytes-like object is required, not '_io.TextIOWrapper'

csv file convert to io.BytesIO object, then stream to blob storage ,meets value type error:a bytes-like object is required, not '_io.TextIOWrapper'

我正在尝试将 csv 流式传输到 azure blob 存储,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'

我认为问题出在格式不正确,请您确定问题所在。谢谢。

您打开 df 进行写入,然后尝试将生成的文件对象作为 io.BytesIO 的初始值设定项传递(应该采用实际的二进制数据,例如 b'1234') .这就是 TypeError 的原因;打开的文件(读或写,文本或二进制文件)不是 bytes 或任何类似的文件(bytearrayarray.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 (如果数据已经在内存中,这是没有意义的)并且直接使用 the bytes based API

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

或者如果 dfstr,而不是 bytes

block_blob_service.create_blob_from_bytes('flowshop', 'testdata123', df.encode('utf-8'))