Pythonでリストを結合して文字列にする方法について解説します。
Contents
リストを結合して文字列にする方法 ~ join ~
Pythonに限らずですが、プログラミングをしているとリストに設定した複数の要素を結合して文字列にしたいといった場面に多く直面します。
Pythonでリストの結合をする場合には、strクラスのjoinメソッドを使用します。以降で、joinメソッドの使い方を説明します。
文字列のリストを結合する場合
joinメソッドで文字列のリストを結合する場合は、以下のようにします。
sample_list = ['Pytho', 'Java', 'Go', 'C', 'C#'] # 文字列をそのまま結合 print(''.join(sample_list)) # 区切り文字でjoinで結合 print(','.join(sample_list))
【実行結果】 PythoJavaGoCC# Pytho,Java,Go,C,C#
文字列を単純につなげたい場合は、空文字('')のjoinメソッドに対象リストを渡すことで結合することができます。
区切り文字を指定したい場合は、区切り文字の文字列のjoinメソッドに結合対象のリストを渡します。上記の例は、','(カンマ)を区切り文字として結合した例です。
数値のリストを結合する場合
joinメソッドを使ったリストの結合は、覚えてしまえば簡単ですが数値のリストを結合する場合には注意が必要です。
文字列と同じように','で数値を結合する場合を考えてみます。
sample_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # 数値リストをjoinでそのまま連結することはできない print(','.join(sample_list))
【実行結果】 TypeError: sequence item 0: expected str instance, int found
上記の場合、joinはstrを想定しているためTypeErrorの例外となります。
数値リストをjoinで結合する場合には、以下のように数値リストをstr()で文字列に変換してからjoinメソッドに渡します。リスト内包表記を使ってまとめて作成すると簡単です。
sample_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # 数値リストをjoinで結合する場合はリスト内包表記でstrに変換してからjoinに渡す print(','.join([str(i) for i in sample_list]))
【実行結果】 1,2,3,4,5,6,7,8,9,10
str.joinの公式ドキュメントの記載はこちらを参照してください。
複数パス文字列を結合する場合
os.path.joinを使用する方法
プログラミングをしているとファイルパスを実行時に組み立てるようなケースがよくあります。
このような時にはstrクラスのjoinメソッドではなく、os.path.joinを使用ができます。os.path.joinは、環境に応じたパス区切り文字を補ってくれるため、環境に合わせた区切り文字の判定等を考慮する必要がありません。
import os target_path = r'D:\test' # 対象フォルダ内のファイル名を順に取得し、パスを作成 for f in os.listdir(target_path): # os.path.joinでフォルダパスとファイル名を結合 tmp_path = os.path.join(target_path, f) print(tmp_path) print('=====') # 新しいファイル用のパスを作成 new_path = os.path.join(target_path, 'tmp', 'sample4.txt') print(new_path)
D:\test\sample1.txt D:\test\sample2.txt D:\test\sample3.txt ===== D:\test\tmp\sample4.txt
上記はあらかじめDドライブにtestというフォルダを作成し、sample1.txt, sample2.txt, sample3.txtというファイルを用意しておいて実行しています。試す場合には任意のフォルダに空ファイル等を作って試してみてください。
os.listdirでは対象フォルダのファイルをリストアップするため、取得できたファイル名を使ってos.path.joinでパスを作成しています。
また、新しいsample4.txt用のパスを作成したい場合にも簡単に作成できます。os.path.joinの引数には連結対象の複数の文字列を指定できるため、パス上のフォルダ名等を複数指定してパスを作ることができます。
os.path.joinの公式ドキュメントの記載はこちらを参照してください。
pathlibモジュールのjoinpathメソッドを使用する方法
上記のos.path.joinは文字列として簡単にファイルパスを作るのに便利でした。その他にも高水準なパスオブジェクトを提供してくれるpathlibモジュールがあります。
pathlibモジュールでは、ファイルシステムのパスを表すクラスを提供してくれているため、各種便利なメソッドなどを使用することができます。
上記のos.path.joinと同じ内容をpathlibで実現する例を見てみましょう。
import pathlib target_path = r'D:\test' # Pathオブジェクトを作成 path = pathlib.Path(r'D:\test') # 対象フォルダ内のファイルを取得 file_path = [x for x in path.iterdir() if x.is_file()] print(file_path) # 色々なメソッドを使用することが可能 print(file_path[0].is_file()) print(file_path[0].is_dir()) print(file_path[0].drive) print(file_path[0].name) print('=====') # 新しいファイル用のパスを作成 new_path = path.joinpath('tmp', 'sample4.txt') print(new_path) print(type(new_path))
【実行結果】 [WindowsPath('D:/test/sample1.txt'), WindowsPath('D:/test/sample2.txt'), WindowsPath('D:/test/sample3.txt')] True False D: sample1.txt ===== D:\test\tmp\sample4.txt <class 'pathlib.WindowsPath'>
まずは、pathlibモジュールをインポートする必要があります。
import pathlib
pathlibでパス用のオブジェクトを作成する場合には、Pathクラスに対象のパスを指定します。
# Pathオブジェクトを作成 path = pathlib.Path(r'D:\test')
Pathオブジェクトはiter_dir()を用いることでファイルパスを取得できます。リスト内包表記を使って、各ファイルパスを取得していますが、例ではx.is_file()という部分でファイルであることを判定して取得しています。例えばここをx.is_dir()とすればフォルダのみを取得することも可能です。
# 対象フォルダ内のファイルを取得 file_path = [x for x in path.iterdir() if x.is_file()] print(file_path) # 色々なメソッドを使用することが可能 print(file_path[0].is_file()) print(file_path[0].is_dir()) print(file_path[0].drive) print(file_path[0].name)
os.path.joinで結合した結果は文字列(str)ですが、pathlibを用いた場合はパス用オブジェクトなのでis_file()やis_dir()でファイルなのかフォルダなのかを判定したり、drive, nameといったプロパティにアクセスするといったことができるため非常に便利です。
また、新しいパスを作成したい場合には、以下のようにjoinpathメソッドを使用することができます。
# 新しいファイル用のパスを作成 new_path = path.joinpath('tmp', 'sample4.txt') print(new_path) print(type(new_path))
os.path.joinと同様に複数の文字列を指定できるため、パス上のフォルダ名等を複数指定してパスを作ることができます。
pathlibの公式ドキュメントの記載はこちらを参照してください。全体的な構成を含めて全体像を理解することができます。
pathlibのjoinpathメソッドについてはこちらを参照してください。
上記で紹介しているソースコードについてはgithubにて公開しています。参考にしていただければと思います。