0
0

bytes型を要素としたリストを、str型を要素としたリストにする(Python 3)

Posted at

はじめに

IPTCInfo3で画像ファイルの情報を取得すると、各要素の型はbytes型(文字列の文字コード)で返されます。
たとえば、キーワードを取得すると、「bytes型を要素としたリスト」を返してきます。

「2月,冬,雪,ダム,雪景色,青空,サンプル」であれば、[b'2\xe6\x9c\x88', b'\xe5\x86\xac', b'\xe9\x9b\xaa', b'\xe3\x83\x80\xe3\x83\xa0', b'\xe9\x9b\xaa\xe6\x99\xaf\xe8\x89\xb2', b'\xe9\x9d\x92\xe7\xa9\xba', b'\xe3\x82\xb5\xe3\x83\xb3\xe3\x83\x97\xe3\x83\xab']が返されます。

これを['2月', '冬', '雪', 'ダム', '雪景色', '青空', 'サンプル']としたいので、各要素をstr型にしたリストに変換する方法を確認しました。

bytes型を要素としたリスト

IPTCInfo3が返してくるリストを想定しています。

# 「2月,冬,雪,ダム,雪景色,青空,サンプル」のリスト。各要素の型はbytes型
keywords = [b'2\xe6\x9c\x88', b'\xe5\x86\xac', b'\xe9\x9b\xaa', b'\xe3\x83\x80\xe3\x83\xa0', b'\xe9\x9b\xaa\xe6\x99\xaf\xe8\x89\xb2', b'\xe9\x9d\x92\xe7\xa9\xba', b'\xe3\x82\xb5\xe3\x83\xb3\xe3\x83\x97\xe3\x83\xab']

処理方法

リスト内包表記

既存のリストから、新たなリストを作成する方法として用意されています。
特に理由がなければ、この方法が良いと考えます。

list_decoded = [k.decode('utf-8') for k in keywords]

# 結果
# ['2月', '冬', '雪', 'ダム', '雪景色', '青空', 'サンプル']

通常のループ

多くの言語で可能な、汎用的な方法です。
Pythonでは、特に事情がなければ、やはりリスト内包表記で処理するのが良いと思います。

list_decoded = []
for k in keywords:
    list_decoded.append(k.decode('utf-8'))

# 結果
# ['2月', '冬', '雪', 'ダム', '雪景色', '青空', 'サンプル']

join()でリストを結合する際に、リストの各要素をデコードして、再度リスト化する

join()でリストを結合する際に各要素をデコードできると知って、最初に思いついた方法です。
これでも動作はしますが、この方法で処理する必要性は少ないと思います。
Pythonらしく記述するなら、リスト内包表記が良いと思います。

list_decoded = b','.join(keywords).decode('utf-8').split(',')

# 結果
# ['2月', '冬', '雪', 'ダム', '雪景色', '青空', 'サンプル']
0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0