Интересно, что, хотя вопрос может показаться разумным, не так просто найти практическую причину, по которой мне нужно было бы преобразовать StringIO
в BytesIO
. Оба они в основном являются буферами, и вам обычно требуется только один из них для дополнительных манипуляций с байтами или текстом.
Возможно, я ошибаюсь, но я думаю, что ваш вопрос на самом деле заключается в том, как использовать экземпляр BytesIO
, когда некоторый код, которому вы хотите передать его, ожидает текстовый файл.
В этом случае это общий вопрос, и решение - codecs module.
Два обычных случая его использования следующие:
Создание объекта файла для чтения
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'"