Pythonでは、文字列を扱う際には主にstr型とbytes型が用いられます。str型は文字データをUTF-8で扱い、どのような文字コードのテキストファイルでもPythonで扱うにはstr型 (UTF-8)に変換する必要があります。
# str型の例
a = "あい"
print(type(a))  # => <class 'str'>
一方、bytes型はバイナリデータを扱うデータ型で、文字列の文字コードを表しています。bytes型のデータはバイトデータと呼ばれ、いわゆるバイナリデータのことです。
# bytes型の例
a_utf8 = a.encode("utf-8")
print(type(a_utf8))  # => <class 'bytes'>
print(a_utf8)  # => b'\xe3\x81\x82\xe3\x81\x84'
このように、str.encode()メソッドを用いることで、str型をbytes型に変換することができます。このとき、encode()メソッドの引数には文字コードを指定します。引数を指定しない場合、デフォルトでUTF-8が選択されます。
また、bytes.decode()メソッドを用いることで、bytes型をstr型に戻すことも可能です。
# bytes型からstr型への変換
a_str = a_utf8.decode("utf-8")
print(type(a_str))  # => <class 'str'>
print(a_str)  # => あい
以上のように、Pythonではstr型とbytes型を用いて、文字列とそのエンコーディングを柔軟に扱うことができます。これらの知識は、テキストデータを扱う多くの場面で役立つでしょう。