在 Python 中将字节转换为 BufferedReader 对象?

Posted

技术标签:

【中文标题】在 Python 中将字节转换为 BufferedReader 对象?【英文标题】:Convert Bytes into BufferedReader object in Python? 【发布时间】:2022-01-07 02:18:47 【问题描述】:

这个问题的标题和this one一样,我已经投票重新提出这个问题。

我想将一个字节对象转换为一个BufferedReader,这是我的尝试(参考了很多文章后):

import numpy as np
from PIL import Image as PILImage
from io import BytesIO
img_np = np.asarray([[[16, 16, 16], [2, 2, 2], [0, 0, 0], [6, 6, 6], [8, 8, 8], [0, 0, 0], [21, 21, 21], [3, 3, 3], [0, 0, 0], [62, 62, 62]], [[0, 0, 0], [71, 71, 71], [142, 142, 142], [107, 107, 107], [99, 99, 99], [101, 101, 101], [4, 4, 4], [86, 86, 86], [99, 99, 99], [146, 146, 146]], [[162, 162, 162], [203, 203, 203], [192, 192, 192], [228, 228, 228], [191, 191, 191], [178, 178, 178], [222, 222, 222], [200, 200, 200], [198, 198, 198], [182, 182, 182]], [[117, 117, 117], [178, 178, 178], [199, 199, 199], [214, 214, 214], [222, 222, 222], [208, 208, 208], [255, 255, 255], [251, 251, 251], [219, 219, 219], [255, 255, 255]], [[0, 0, 0], [0, 0, 0], [80, 80, 80], [169, 169, 169], [193, 193, 193], [238, 238, 238], [239, 239, 239], [243, 243, 243], [254, 254, 254], [230, 230, 230]], [[20, 20, 20], [20, 20, 20], [9, 9, 9], [1, 1, 1], [130, 130, 130], [194, 194, 194], [216, 216, 216], [255, 255, 255], [252, 252, 252], [255, 255, 255]], [[9, 9, 9], [0, 0, 0], [0, 0, 0], [0, 0, 0], [3, 3, 3], [44, 44, 44], [191, 191, 191], [217, 217, 217], [248, 248, 248], [225, 225, 225]], [[0, 0, 0], [11, 11, 11], [3, 3, 3], [11, 11, 11], [6, 6, 6], [15, 15, 15], [0, 0, 0], [153, 153, 153], [255, 255, 255], [253, 253, 253]], [[0, 0, 0], [5, 5, 5], [1, 1, 1], [4, 4, 4], [8, 8, 8], [4, 4, 4], [3, 3, 3], [0, 0, 0], [159, 159, 159], [241, 241, 241]], [[10, 10, 10], [9, 9, 9], [6, 6, 6], [2, 2, 2], [0, 0, 0], [0, 0, 0], [3, 3, 3], [20, 20, 20], [0, 0, 0], [185, 185, 185]]])
im = PILImage.fromarray(img_np.astype(np.uint8))
# im.save('./temp.jpeg', "JPEG")
# f = open('./temp.jpeg', 'rb')
# print(type(f))

#
b_handle = io.BytesIO()
im.save(b_handle, format="JPEG")
# b = im.tobytes()
print(type(b_handle))
b = b_handle.read()
print(type(b))
print(b)

im.save(b_handle, format="JPEG")
b_br = io.BufferedReader(b_handle)
print(type(b_br))
b = b_br.read()
print(type(b))
print(b)

输出如下:

<class '_io.BytesIO'>
<class 'bytes'>
b''
<class '_io.BufferedReader'>
<class 'bytes'>
b''

文件之类的对象似乎是空的。我知道对于b_handle,我可以通过b_handle.getvalue() 获取值,但对于缓冲读取器,它不能作为文件对象工作。

如何将字节字符串转换为缓冲读取器对象,就像打开文件一样?

【问题讨论】:

【参考方案1】:

你快到了。将图像字节保存到缓冲区后,您需要在 read 调用之前将 seek(更改流位置) 字节偏​​移量 0。

b_handle = io.BytesIO()
im.save(b_handle, format="JPEG")
b_handle.seek(0)
b_handle.name = "temp.jpeg"
b_br = io.BufferedReader(b_handle)
b = b_br.read()

例子,

>>> from io import BytesIO, BufferedReader
>>>
>>> b_handle = BytesIO()
>>> b_handle.write(b"Hello World")
11
>>> b_handle.seek(0) # This is important.
0
>>> br = BufferedReader(b_handle)
>>> br
<_io.BufferedReader>
>>> br.read()
b'Hello World'

【讨论】:

但它不是 BufferedReader 对象。 @LernerZhang 您的做法是正确的。您可以直接将b_handle 传递给BufferedReader但请确保在此初始化语句之前调用b_handle.seek(b_br = io.BufferedReader(b_handle))

以上是关于在 Python 中将字节转换为 BufferedReader 对象?的主要内容,如果未能解决你的问题,请参考以下文章

在python中将字节转换为BufferedReader [重复]

在python中将字节转换为文件对象

如何在python中将纯文本转换为分段块(字节)? [复制]

在 Python 3 中将字节转换为十六进制字符串的正确方法是啥?

在 Python 3 中将 int 转换为字节

如何在 Python 中将字符串转换为字节数组