Snippetsコピペ用のPython便利コードをメモっていくサイトですメニューコンテンツへ移動ホームpython3のbytes型とstr型の比較と変換方法3件の返信python3では、文字列とバイト列の区別が明確になりました。python2でバイナリデータを文字列で扱っていたり、strとunicodeの使い分けで混乱していたのがスッキリしたと思いますが、python2から移行するとちょっと混乱したりするのでまとめて置きます。語弊のある書き方かもしれませんが、ありがちな使われ方の例としてマトリックスを作成しました。(u'')3では文字列はunicode文字列として扱われるようになったので、すべてpython2でいうところのu''になりました。u''表記してもエラーにはなりませんが(python3.3以上)同じ意味です。バイナリデータを扱うときには、bytes型に変換します。bytes型は文字列っぽく扱えますが、strとbytesの連結などはできないので用途に合わせて適切な型で持つようにします。特定の文字コードの文字列を持ちたい場合はbytes型になります。str文字列として加工などをして最終的に出力する際に、任意の文字コードのバイト列としてエンコードして出力するという使い方になります。strからbytesencodeでbytes型(utf-8)に変換します。bytesからstrdecodeで文字列に変換します。b'\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86'.decode('utf-8')'あいう'文字列のエンコードを意識した操作たとえばファイルへShift_JISエンコードの文字列を出力したい場合、Python3においてはそれはbytes型のバイナリデータの出力という意味になります。Python3の文字列は内部的にUnicodeで保持していますが、これをShift_JISにエンコードすることでbytes型のバイナリデータになります。(python2の時には、unicode文字列からstr文字列になっていました)ShiftJISやEUCの文字列を正規表現で比較したい場合Python3では、SJISやEUCの文字列はbytes型になってしまいますが、そのようなバイナリデータを正規表現でマッチングしたい場合にはどうすればよいでしょうか?通常のマッチングであれば、decodeによってUnicode文字列に変換してから、Unicode文字列の世界でマッチングすれば問題ありません。してもSJISの文字コードの範囲などでマッチングしたい場合は、パターン文字列もbytes型で記述することで可能です。※上記はどうしてもsjisの文字コードで正規表現パターンを作りたかったため行ったもの。'A'を探したいだけであれば、Unicode文字列に変換後にマッチングするほうが一般的。sjis_str.decode('sjis')).group(0)'A'関連記事:HTTPのPOST/GETリクエストをする文字列からbool値に変換する文字→ascii。lighttpdを動かす。コメントをキャンセルメールアドレスが公開されることはありません。*サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。date*日本語が含まれない投稿は無視されますのでご注意ください。