Python中如何将Bytes字节对象转换为BufferedReader对象
问题原因
BytesIO是内存中的类文件对象,和磁盘文件对象行为一致:写入操作完成后,文件指针会停在写入内容的末尾,后续如果不重置指针位置,直接调用read()类方法只会读到指针后的空内容,这就是你两次输出b''的核心原因。getvalue()方法不受指针位置影响,可以直接返回全部内容,所以你之前调用这个方法可以正常拿到数据。- 你代码中还存在导入缺失问题:用到了
io.BufferedReader但仅导入了BytesIO,未导入io模块本身。
正确实现方案
场景1:从已有字节字符串转换为BufferedReader
如果你已经拿到了bytes对象,可直接按如下步骤转换,效果和本地文件rb模式打开完全一致:
import io # 假设你已有字节对象b b = b"your byte content" # 1. 将字节对象装入BytesIO,用bytes初始化的BytesIO指针默认在开头,不需要手动重置 bytes_io = io.BytesIO(b) # 2. 包装为BufferedReader buffered_reader = io.BufferedReader(bytes_io) # 测试读取 print(buffered_reader.read()) # 可以正常读到内容
场景2:修复你当前的PIL保存转BufferedReader代码
你原有代码调整后如下即可正常运行:
import numpy as np from PIL import Image as PILImage import io # 修正导入问题 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)) b_handle = io.BytesIO() im.save(b_handle, format="JPEG") # 关键步骤:重置文件指针到开头 b_handle.seek(0) # 包装为BufferedReader b_br = io.BufferedReader(b_handle) # 此时可以正常读取内容 print(b_br.read())
内容的提问来源于stack exchange,提问作者Lerner Zhang
相关产品推荐
相关产品推荐

