Pythonでテキストを扱う場面では、文字列を区切りで分割したり、分割した要素を再び結合したりする操作が頻繁に登場します。
この記事では、split
とjoin
の基本から実用的な使い方、そして初心者がつまずきやすい注意点までを段階的に解説します。
Pythonのsplitとjoinの基本
splitの基本と使いどころ
split
は文字列(例: "a,b,c"
)を、指定した区切りで分割してリストにします。
引数を省略すると空白類(スペース、タブ、改行などのホワイトスペース)を連続として扱い、先頭末尾の余分な空白も自動で無視します。
明示的に区切り文字を指定すると、その文字の出現箇所で分割します。
使いどころ
文を単語に分解したい、CSV風の1行を要素に分けたい、パスや拡張子を取り出したい、といった場合に役立ちます。
例(最小例)
# 空白で単語に分割
s = "apple banana cherry"
parts = s.split()
print(parts) # リストとして返る
['apple', 'banana', 'cherry']
joinの基本と使いどころ
join
は、リストやタプルなどの反復可能オブジェクトの要素(すべて文字列)を、呼び出し元の文字列を区切りとして結合します。
重要なポイントは、join
は「区切り文字」の側のメソッドであることです。
使いどころ
単語の配列を1つの文に戻す、CSVやTSV形式の1行を作る、複数行のテキストを改行で連結する、といった用途で使います。
例(最小例)
# カンマ区切りの文字列を作成
items = ["apple", "banana", "cherry"]
line = ",".join(items)
print(line)
apple,banana,cherry
splitで文字列を分割する
空白で分割する基本
引数を省略したsplit()
は、空白類がいくつ連続していても1つの区切りとみなし、先頭末尾の空白も自動的に無視します。
これはテキスト中の余計な空白を気にせずに単語を取り出したいときに便利です。
デフォルト引数の挙動
text = " Python is\tawesome \n indeed "
print(text.split()) # 引数なし: 空白類をまとめて扱い、空要素を作らない
print(text.split(" ")) # 引数あり: 連続スペースは空文字要素を生む
['Python', 'is', 'awesome', 'indeed']
['', '', 'Python', '', '', 'is\tawesome', '', 'indeed', '', '']
区切り文字を指定して分割する
,
や-
のような特定の1文字(または文字列)を区切りにしたい場合は、明示的に指定します。
例(CSV風の1行)
line = "Alice,Bob,Charlie"
names = line.split(",")
print(names)
['Alice', 'Bob', 'Charlie']
連続する区切りと空要素の扱い
区切り文字を明示すると、その文字が連続している箇所で空文字が要素として現れます。
データに欠損(空フィールド)があることを表現したいときには有用ですが、不要なら後処理で取り除きます。
例(空要素が生まれる)
s = ",a,,b,"
parts = s.split(",")
print(parts) # 先頭・連続・末尾の区切りで空文字が入る
# 空要素を除去したい場合
non_empty = [p for p in parts if p != ""]
print(non_empty)
['', 'a', '', 'b', '']
['a', 'b']
分割回数を制限するmaxsplit
第2引数のmaxsplit
で、分割回数(切れ目の回数)を制限できます。
制限回数を超えた残りはまとめて最後の要素に入ります。
例(maxsplitの活用)
s = "a,b,c,d"
print(s.split(",", 2)) # 左から2回まで分割
print(s.split(",", 0)) # 0なら分割しないのと同じ
# 空白分割でもmaxsplitを使える(引数Noneでデフォルトの空白扱い)
t = "one two three four"
print(t.split(None, 1)) # 1回だけ分割
['a', 'b', 'c,d']
['a,b,c,d']
['one', 'two three four']
右から分割するrsplit
右側(末尾側)から分割したい場合はrsplit
を使います。
maxsplit
と組み合わせると、末尾の一部だけを切り出すのに便利です。
例(拡張子を安全に取り出す)
filename = "archive.tar.gz"
print(filename.rsplit(".", 1)) # 右から1回だけ分割: 拡張子部分を抽出
path = "/usr/local/bin/python3"
print(path.rsplit("/", 1)) # 右から1回: ディレクトリとファイル名
['archive.tar', 'gz']
['/usr/local/bin', 'python3']
joinで文字列を結合する
リストやタプルを区切りで結合する
sep.join(iterable)
の形で、iterable
の各要素をsep
でつなぎます。
要素はすべて文字列である必要があります。
例(スペースやカンマで結合)
words = ["Python", "is", "fun"]
sentence = " ".join(words)
print(sentence)
colors = ("red", "green", "blue")
csv_line = ",".join(colors)
print(csv_line)
Python is fun
red,green,blue
数値を含む要素は文字列に変換する
join
は非文字列を受け付けません。
数値が混じる場合はmap(str, ...)
や内包表記で変換します。
例(mapで一括変換)
values = [10, 20, 30]
joined = ",".join(map(str, values)) # 各要素を文字列化
print(joined)
# 内包表記でもOK
joined2 = " + ".join([str(v) for v in values])
print(joined2)
10,20,30
10 + 20 + 30
改行やタブで結合して整形する
行は\n
、TSVは\t
で結合すると見やすく整形できます。
例(簡易TSVの作成)
rows = [
["id", "name", "score"],
[1, "Alice", 92],
[2, "Bob", 85],
[3, "Charlie", 88],
]
# 各行をタブで結合、数値は文字列に変換
lines = ["\t".join(map(str, row)) for row in rows]
# 複数行を改行で連結
tsv_text = "\n".join(lines)
print(tsv_text)
id name score
1 Alice 92
2 Bob 85
3 Charlie 88
空文字で結合して文字を連結する
空文字""
を区切りに使うと、1文字ずつの配列から高速に文字列を作成できます。
ループで+
連結するより効率的です。
例(文字の配列を連結)
chars = ["P", "y", "t", "h", "o", "n"]
word = "".join(chars)
print(word)
Python
splitとjoinの実用パターンと注意点
分割して加工して再結合する手順
典型的な流れは「分割→各要素を加工→再結合」です。
たとえば、key=value
形式のペアがカンマで並んでいる文字列を、key: value
という読みやすい書式に変換してみます。
例(分割→加工→再結合)
line = "id=42,name=Alice,lang=Python"
# 1) カンマで分割して各ペアを取り出す
pairs = line.split(",")
# 2) 各ペアを左から1回だけ'='で分割し、'key: value'の形に整形
pretty_pairs = []
for kv in pairs:
key, value = kv.split("=", 1)
pretty_pairs.append(f"{key}: {value}")
# 3) セミコロンとスペースで再結合
result = "; ".join(pretty_pairs)
print(result)
id: 42; name: Alice; lang: Python
空白の正規化
入力の空白が不揃いな場合、split()
で空白類をまとめて分割し、" ".join(...)
で単一スペースに統一できます。
文章の整形に有効です。
例(空白を1つに揃える)
messy = " Python is\tgreat \n indeed "
normalized = " ".join(messy.split())
print(normalized)
Python is great indeed
注意: この方法は改行もスペース化してしまいます。
改行を保持したい場合は、行ごとに処理してから改行で再結合するなどの工夫が必要です。
splitで空文字は区切りにできない
split("")
のように空文字で分割しようとするとValueError
になります。
1文字ずつに分解したい場合はlist(s)
や内包表記を使います。
例(エラーと代替方法)
s = "abc"
try:
s.split("") # 空文字は区切りにできない
except ValueError as e:
print("エラー:", e)
# 代替: 文字ごとのリストが欲しいならlistを使う
print(list(s))
エラー: empty separator
['a', 'b', 'c']
joinで非文字列が含まれるとエラーになる
join
の対象に整数やNone
など非文字列が含まれているとTypeError
になります。
必ず文字列化してから結合します。
例(エラーと対策)
items = ["A", 1, "B"]
try:
print(",".join(items)) # intが含まれるのでエラー
except TypeError as e:
print("エラー:", e)
# 対策1: mapで一括変換
print(",".join(map(str, items)))
# 対策2: 内包表記で明示的に変換
print(",".join(str(x) for x in items))
エラー: sequence item 1: expected str instance, int found
A,1,B
A,1,B
参考: splitの挙動まとめ(空白と明示区切りの違い)
次の表は、空白分割と明示区切り分割の違いを具体例で示したものです。
区切り指定 | 入力文字列 | 出力リスト | 特徴 |
---|---|---|---|
なし | ” A B\tC “ | [“A”, “B”, “C”] | 連続する空白を1つとして扱い、空要素は作らない |
” “ | ” A B\tC “ | [“”, “”, “A”, “”, “”, “B\tC”, “”, “”] | スペースのみが区切り。連続や端の区切りで空要素ができる |
“,” | “,a,,b,” | [“”, “a”, “”, “b”, “”] | 先頭・末尾・連続の区切りで空要素ができる |
None,1回 | “one two three” | [“one”, “two three”] | split(None, 1) で空白連続でも1回だけ分割 |
“.”,1回(右) | “archive.tar.gz” | [“archive.tar”, “gz”] | rsplit(".", 1) で右から分割して末尾部分を取得 |
空白を「きれいに」分割したい場合は引数なしのsplit()
、空要素も重要なデータとして扱いたい場合は明示的に区切り文字を指定する、という方針が目安になります。
まとめ
split
とjoin
は、文字列処理の基礎でありながら、実務でも頻繁に使われる重要なメソッドです。
split()
は引数なしで「空白をきれいに」分割し、明示区切りでは空要素が生まれること、maxsplit
とrsplit
で分割の方向と回数を制御できることを押さえましょう。
join
は区切り文字側のメソッドで、対象はすべて文字列である必要があります。
数値が含まれる場合はmap(str, ...)
などで文字列化し、空白の正規化やCSV/TSVの整形、分割→加工→再結合といったパターンに自信を持って適用できるようにしておくと、文字列処理の多くの問題をスムーズに解決できるようになります。