はじめに
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月', '冬', '雪', 'ダム', '雪景色', '青空', 'サンプル']