【Python】【encode,decode】「型」と「型変換」について調べた

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

 

 

バイト列とは?

そもそも論ですが、なぜ「バイト列」を使う必要があるのでしょうか?

 

str 型から bytes 型へ

encodeを使います。

以下の構文で変換できます。

'変換したい文字列'.encode('utf-8')

 

以下のように「b'~'」と表示されます。

(pyenv) [test@SAKURA_VPS scraping]$ python
Python 3.6.3 (default, Oct 11 2017, 18:17:37)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> '変換したい文字列'.encode('utf-8')
b'\xe5\xa4\x89\xe6\x8f\x9b\xe3\x81\x97\xe3\x81\x9f\xe3\x81\x84\xe6\x96\x87\xe5\xad\x97\xe5\x88\x97'
>>>

 

 

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')
<class 'str'> ← str型になっています。
>>>

>>> uni = u'ユニコード型?'
>>> type(uni)
<class 'str'> ← やはり str型です。
>>>

 

 

 

str型 → bytes型 に変換する

encode

ubuntu@AWS_TEST: ~/dl] python3.6
Python 3.6.3 (default, Oct  6 2017, 08:44:35)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> type('あいうえお')
<class 'str'> ← str型
>>>

>>> 'あいうえお'.encode('utf-8') ← str型→bytes型へ
b'\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a'
>>> 'あいうえお'.decode('utf-8') ← 試しに decode にしたみたら

AttributeError: 'str' object has no attribute 'decode'

>>>

 

bytes型 → str型 に変換する

decode

>>> type(b'\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a')
<class 'bytes'>
>>> b'\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a'.decode('utf-8')
'あいうえお'

>>> '\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a'.decode('utf-8') ← 先頭の b を取ると。。
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'decode' ← str型だと認識されてしまい、エラーになります。

 

 

 

 

 

参考サイト

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/

まとめ

ややこしくてなかなか理解できません。

 

■登場人物

 

 

 

Posted by 100%レンタルサーバーを使いこなすサイト管理人