Python 3 での「型」と「型変換」について調べました。
想像以上に複雑で、まだまだ理解できていません。
型を調べる
型変換をしようとしても初めに現在の型は何か確認する必要があります。
■直接指定する場合
print(type(‘調べたいデータ’)) |
■変数の中身を調べる場合
var = ‘調べたいデータ’ print(type(var)) |
bytes型なら以下のように表示されます。
b’e382a2e38395 ~’ |
Python 3 では「文字列」は「str型」と「bytes型」の2種類がある
今まで「文字列」イコール「str型」と思っていましたが、そうではなかったんですね。
しかし「文字列」と「バイト列」もありますので更に複雑です。
Python の b’e382a2e38395 ~’ の「b」は何か?
バイト列型(bytes型)の場合、以下のように「b’~’」と出力されます。
そもそもこの「b」は何でしょうか。
b’~’の「b」は、バイト列を表現するためについています。
b’a’ ← bytes型で「a」
b’~’ ← OK
b”~” ← これも OK
バイト列とは?
そもそも論ですが、なぜ「バイト列」を使う必要があるのでしょうか?
- 16進数で確認したい
- バイト列は一見すると「文字列」に見えるが「文字列」ではない
str 型から bytes 型へ
encodeを使います。
以下の構文で変換できます。
‘変換したい文字列’.encode(‘utf-8’) |
以下のように「b’~’」と表示されます。
(pyenv) [test@SAKURA_VPS scraping]$ python |
bytes 型から str 型へ
decodeを使います。
以下の構文で変換できます。
b’\xe5\xa4\x89\xe6\x8f\x9b‘.decode(‘utf-8’) |
以下のように「b’~’」と表示されます。
>>> b’\xe5\xa4\x89\xe6\x8f\x9b’.decode(‘utf-8’) |
bytearray 型
bytearray 型は変更可能。
変更もできます。
bytearray.replace(old, new[, count])
ord とは?
1 文字の Unicode 文字を表す文字列に対し、その文字の Unicode コードポイントを表す整数を返します。
例えば、 ord(‘a’) は整数 97 を返し、ord(‘€’) (ユーロ記号) は 8364 を返します。
これは chr() の逆です。
Python 3 の場合の「encode」と「decode」
Python 3 では文字列はすべてunicode文字列として扱われるようになりました。
Python3系 Python2系
byte列 bytes(b”) str(”)
通常の文字列 str(”) str(”)
unicode文字列 str(”) unicode(u”)
https://python.civic-apps.com/python3-bytes-str-convert/
type()で確認しても unicode型がなくなりました。
Python 2系なら「type ‘unicode’」と表示されていたと思います。
>>> type(u’\u3042′) >>> uni = u’ユニコード型?’ |
str型 → bytes型 に変換する
encode
ubuntu@AWS_TEST: ~/dl] python3.6 >>> ‘あいうえお’.encode(‘utf-8’) ← str型→bytes型へ
|
bytes型 → str型 に変換する
decode
>>> type(b’\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a’) >>> ‘\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a’.decode(‘utf-8’) ← 先頭の b を取ると。。 |
参考サイト
Pythonのstr型とbytes型
https://www.kannon.link/fuku/index.php/2017/02/22/01-34/
python3のbytes型とstr型の比較と変換方法
https://python.civic-apps.com/python3-bytes-str-convert/
まとめ
ややこしくてなかなか理解できません。
■登場人物
- 文字列
- バイト列
- str型
- bytes型
- bytearray型
- unicode文字列
コメント