閉じる

Pythonのsplitとjoinで文字列を分割・結合する方法

Pythonでテキストを扱う場面では、文字列を区切りで分割したり、分割した要素を再び結合したりする操作が頻繁に登場します。

この記事では、splitjoinの基本から実用的な使い方、そして初心者がつまずきやすい注意点までを段階的に解説します。

Pythonのsplitとjoinの基本

splitの基本と使いどころ

splitは文字列(例: "a,b,c")を、指定した区切りで分割してリストにします。

引数を省略すると空白類(スペース、タブ、改行などのホワイトスペース)を連続として扱い、先頭末尾の余分な空白も自動で無視します。

明示的に区切り文字を指定すると、その文字の出現箇所で分割します。

使いどころ

文を単語に分解したい、CSV風の1行を要素に分けたい、パスや拡張子を取り出したい、といった場合に役立ちます。

例(最小例)

Python
# 空白で単語に分割
s = "apple banana cherry"
parts = s.split()
print(parts)  # リストとして返る
実行結果
['apple', 'banana', 'cherry']

joinの基本と使いどころ

joinは、リストやタプルなどの反復可能オブジェクトの要素(すべて文字列)を、呼び出し元の文字列を区切りとして結合します。

重要なポイントは、joinは「区切り文字」の側のメソッドであることです。

使いどころ

単語の配列を1つの文に戻す、CSVやTSV形式の1行を作る、複数行のテキストを改行で連結する、といった用途で使います。

例(最小例)

Python
# カンマ区切りの文字列を作成
items = ["apple", "banana", "cherry"]
line = ",".join(items)
print(line)
実行結果
apple,banana,cherry

splitで文字列を分割する

空白で分割する基本

引数を省略したsplit()は、空白類がいくつ連続していても1つの区切りとみなし、先頭末尾の空白も自動的に無視します。

これはテキスト中の余計な空白を気にせずに単語を取り出したいときに便利です。

デフォルト引数の挙動

Python
text = "  Python   is\tawesome \n indeed  "
print(text.split())         # 引数なし: 空白類をまとめて扱い、空要素を作らない
print(text.split(" "))      # 引数あり: 連続スペースは空文字要素を生む
実行結果
['Python', 'is', 'awesome', 'indeed']
['', '', 'Python', '', '', 'is\tawesome', '', 'indeed', '', '']

区切り文字を指定して分割する

,-のような特定の1文字(または文字列)を区切りにしたい場合は、明示的に指定します。

例(CSV風の1行)

Python
line = "Alice,Bob,Charlie"
names = line.split(",")
print(names)
実行結果
['Alice', 'Bob', 'Charlie']

連続する区切りと空要素の扱い

区切り文字を明示すると、その文字が連続している箇所で空文字が要素として現れます。

データに欠損(空フィールド)があることを表現したいときには有用ですが、不要なら後処理で取り除きます。

例(空要素が生まれる)

Python
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の活用)

Python
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と組み合わせると、末尾の一部だけを切り出すのに便利です。

例(拡張子を安全に取り出す)

Python
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でつなぎます。

要素はすべて文字列である必要があります。

例(スペースやカンマで結合)

Python
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で一括変換)

Python
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の作成)

Python
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文字ずつの配列から高速に文字列を作成できます。

ループで+連結するより効率的です。

例(文字の配列を連結)

Python
chars = ["P", "y", "t", "h", "o", "n"]
word = "".join(chars)
print(word)
実行結果
Python

splitとjoinの実用パターンと注意点

分割して加工して再結合する手順

典型的な流れは「分割→各要素を加工→再結合」です。

たとえば、key=value形式のペアがカンマで並んでいる文字列を、key: valueという読みやすい書式に変換してみます。

例(分割→加工→再結合)

Python
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つに揃える)

Python
messy = "  Python   is\tgreat \n indeed  "
normalized = " ".join(messy.split())
print(normalized)
実行結果
Python is great indeed

注意: この方法は改行もスペース化してしまいます。

改行を保持したい場合は、行ごとに処理してから改行で再結合するなどの工夫が必要です。

splitで空文字は区切りにできない

split("")のように空文字で分割しようとするとValueErrorになります。

1文字ずつに分解したい場合はlist(s)や内包表記を使います。

例(エラーと代替方法)

Python
s = "abc"
try:
    s.split("")  # 空文字は区切りにできない
except ValueError as e:
    print("エラー:", e)

# 代替: 文字ごとのリストが欲しいならlistを使う
print(list(s))
実行結果
エラー: empty separator
['a', 'b', 'c']

joinで非文字列が含まれるとエラーになる

joinの対象に整数やNoneなど非文字列が含まれているとTypeErrorになります。

必ず文字列化してから結合します。

例(エラーと対策)

Python
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()、空要素も重要なデータとして扱いたい場合は明示的に区切り文字を指定する、という方針が目安になります。

まとめ

splitjoinは、文字列処理の基礎でありながら、実務でも頻繁に使われる重要なメソッドです。

split()は引数なしで「空白をきれいに」分割し、明示区切りでは空要素が生まれること、maxsplitrsplitで分割の方向と回数を制御できることを押さえましょう。

joinは区切り文字側のメソッドで、対象はすべて文字列である必要があります。

数値が含まれる場合はmap(str, ...)などで文字列化し、空白の正規化やCSV/TSVの整形、分割→加工→再結合といったパターンに自信を持って適用できるようにしておくと、文字列処理の多くの問題をスムーズに解決できるようになります。

この記事を書いた人
エーテリア編集部
エーテリア編集部

人気のPythonを初めて学ぶ方向けに、文法の基本から小さな自動化まで、実際に手を動かして理解できる記事を書いています。

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!