原始问题: 我有一个 StringIO 对象,如何将它转换为 BytesIO ?
更新: 更普遍的问题是,如何在 python3 中将二进制(编码的) 类文件 对象转换为解码 的类文件 对象?
我得到的天真方法是:
import io
sio = io.StringIO('wello horld')
bio = io.BytesIO(sio.read().encode('utf8'))
print(bio.read()) # prints b'wello horld'
有没有更有效和优雅的方式来做到这一点?上面的代码只是将所有内容读入内存,对其进行编码,而不是将数据分块流式传输。
例如,对于反向问题( BytesIO
-> StringIO
)存在一个类 - io.TextIOWrapper 正是这样做的(见这个 答案)
原文由 ShmulikA 发布,翻译遵循 CC BY-SA 4.0 许可协议
有趣的是,尽管这个问题看起来很合理,但要找出我需要将
StringIO
转换为BytesIO
的实际原因并不容易。两者基本上都是缓冲区,您通常只需要其中一个就可以对字节或文本进行一些额外的操作。我可能是错的,但我认为你的问题实际上是如何使用
BytesIO
实例,当你想要传递给它的某些代码需要一个文本文件时。在这种情况下,这是一个常见问题,解决方案是 编解码器 模块。
使用它的两种常见情况如下:
编写要读取的文件对象
编写要写入的文件对象