原始问题:我有一个StringIO对象,如何将其转换为BytesIO

更新:更普遍的问题是,如何在python3中将二进制(编码)file-like对象转换为解码后的file-like对象?

我得到的天真的方法是:

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,它确实做到了这一点(请参阅此answer)

最佳答案

有趣的是,尽管这个问题看似合理,但要找出将为什么将StringIO转换为BytesIO的实际原因并不容易。两者基本上都是缓冲区,通常只需要其中一个即可对字节或文本进行一些其他操作。

我可能是错的,但我认为您的问题实际上是当要传递给它的某些代码需要文本文件时,如何使用BytesIO实例。

在这种情况下,这是一个常见问题,解决方案是codecs模块。

使用它的两种常见情况如下:

编写要读取的文件对象

In [16]: import codecs, io

In [17]: bio = io.BytesIO(b'qwe\nasd\n')

In [18]: StreamReader = codecs.getreader('utf-8')  # here you pass the encoding

In [19]: wrapper_file = StreamReader(bio)

In [20]: print(repr(wrapper_file.readline()))
'qwe\n'

In [21]: print(repr(wrapper_file.read()))
'asd\n'

In [26]: bio.seek(0)
Out[26]: 0

In [27]: for line in wrapper_file:
    ...:     print(repr(line))
    ...:
'qwe\n'
'asd\n'

编写要写入的文件对象
In [28]: bio = io.BytesIO()

In [29]: StreamWriter = codecs.getwriter('utf-8')  # here you pass the encoding

In [30]: wrapper_file = StreamWriter(bio)

In [31]: print('жаба', 'цап', file=wrapper_file)

In [32]: bio.getvalue()
Out[32]: b'\xd0\xb6\xd0\xb0\xd0\xb1\xd0\xb0 \xd1\x86\xd0\xb0\xd0\xbf\n'

In [33]: repr(bio.getvalue().decode('utf-8'))
Out[33]: "'жаба цап\\n'"

关于python - 将io.StringIO转换为io.BytesIO,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55889474/

10-13 04:43