Pythonで文字列データまたは文字列ストリーム(StringIO)をバイナリストリーム(BytesIO)に変換するの巻

Pythonで文字列データまたは文字列ストリーム(StringIO)をバイナリストリーム(BytesIO)に変換するの巻

はじめに

Pythonで、文字列データを別の関数に渡したいときに、バイナリのオブジェクトを入力に要求されまして。どうしましょ。という話です。

ええと、要は標準モジュールのioを使えば良いのですが、文字列データからいきなりBytesIOにしようとすると怒られる。

なので

文字列データをバイナリに変換してBytesIOに渡せばいい

と。

いやまあ、それだけのことなんですけどちょっとばたついてしまったのでメモ。

うっかり誰かの役に立つかもしれませんし。

やり方

事例ということで、文字列データとして、

str_data = 'vucavucalife'

を使うことにします。

結局、こんな感じでいい、と。

import io

strIO = io.StringIO('vucavucalife')

bin_data_from_strIO = io.BytesIO(bytes(strIO.getvalue(), encoding='utf-8'))

print(bin_data_from_strIO)

出力結果

<_io.BytesIO object at 0x108c11bd0>

経緯といいますか、

とりあえず、

str_data = 'vucavucalife'

に対して、バイナリオブジェクトが欲しいんですと思って

import io
io.BytesIO(str_data)

としようとすると、

--------------------------------------------
TypeError  Traceback (most recent call last)
<ipython-input-4-afbf98af15b5> in <module>
      1 import io
----> 2 io.BytesIO(str_data)

TypeError: a bytes-like object is required, not 'str'

と、怒られる。あ、そりゃそうか。

なので、一旦bytesでバイナリにしてからBytesIOに渡します。

bin_data = io.BytesIO(bytes(str_data, 'utf-8'))

print(bin_data)

出力結果

<_io.BytesIO object at 0x108307220>

でけた。

StringIOからBytesIOに変換したい場合には、

例えば

strIO = io.StringIO('vucavucalife')
print(strIO)

出力結果

<_io.StringIO object at 0x108c2ba60>

に対して、、、

getvalue()で中身を取り出したものにbytesを当てて、それをBytesIOに渡す、と。

bin_data_from_strIO = io.BytesIO(bytes(strIO.getvalue(), encoding='utf-8'))
print(bin_data_from_strIO)

 出力結果

<_io.BytesIO object at 0x108c36e50>

できました。

bytesを使わずにencode()を使ってもいいです。

bin_data_from_strIO = io.BytesIO(strIO.getvalue().encode())
print(bin_data_from_strIO)

出力結果

<_io.BytesIO object at 0x108c48270>

めでたしめでたし。

おわりに

文字列データ(または文字列ストリーム)をバイナリストリームに変換する方法でした。

余談ですが、今回のデータの受け渡しの検討をしているときに、当初getvalue()じゃなくてread()を使って中身を取り出していたのですが、

同じ式を重複して使用していることに気づかずに、二回目になる式からデータの受け渡しを試みてしまっていまして。。。

延々と空データが返されるのを「なんでじゃー o(`ω´ )o」てなってました。。。

気付くまでに相当時間がかかった。。。


ちょっと広告です
https://business.xserver.ne.jp/

https://www.xdomain.ne.jp/

★LOLIPOP★

.tokyo

MuuMuu Domain!

実施環境

Python 3.9.4

macOS Catalina ver.10.15.7

参考にしたページ等

https://stackoverflow.com/questions/55889474/convert-io-stringio-to-io-bytesio

https://medium.com/swlh/python-stringio-and-bytesio-compared-with-open-c0e99b9def31



https://business.xserver.ne.jp/

https://www.xdomain.ne.jp/

★LOLIPOP★

.tokyo

MuuMuu Domain!