- Python
Python splitとjoinの使い方|文字列の分割と結合まとめ
Pythonのsplitは「文字列を区切り文字で分割してリストにする」メソッド、joinは「リストなどの文字列を区切り文字でつないで1つの文字列にする」メソッドです。 2つはちょうど逆向きの操作で、"a,b,c".split(",") で ['a', 'b', 'c'] に分け、",".join(['a', 'b', 'c']) で 'a,b,c' に戻せます。
この記事では、分割と結合の書き方をすべて実行結果つきでまとめました。split() と split(" ") で連続した空白の扱いが変わる点、空文字を分割したときの結果、maxsplit・rsplit・splitlines・re.split(複数の区切り文字)の一覧、joinに数値リストを渡したときのTypeErrorを直す流れ、CSV1行を分割して加工し結合し直す往復の例まで、コピーしてそのまま動かせる形で載せています。コードと出力は Python 3.11.15 で実行して確認したものです。
splitとjoinの早見表
まず「やりたいこと」から書き方を引ける一覧です。結果の列は、すべて実際に実行して得た値です。
| やりたいこと | 書き方 | 結果 |
|---|---|---|
| カンマで分割する | "a,b,c".split(",") |
['a', 'b', 'c'] |
| 空白でまとめて分割する | "a b c".split() |
['a', 'b', 'c'] |
| 半角スペース1個ずつで分割する | "a b c".split(" ") |
['a', '', 'b', 'c'] |
| 先頭から1回だけ分割する | "a,b,c,d".split(",", 1) |
['a', 'b,c,d'] |
| 末尾から1回だけ分割する | "a,b,c,d".rsplit(",", 1) |
['a,b,c', 'd'] |
| 最初の区切りで3つに分ける | "key=a=b".partition("=") |
('key', '=', 'a=b') |
| 行ごとに分割する | "a\nb\r\nc\n".splitlines() |
['a', 'b', 'c'] |
| 複数の区切り文字で分割する | re.split(r"[,;/]", "a,b;c/d") |
['a', 'b', 'c', 'd'] |
| カンマと空白をまとめて区切りにする | re.split(r"[,\s]+", "a, b c,d") |
['a', 'b', 'c', 'd'] |
| 1文字ずつに分ける | list("abc") |
['a', 'b', 'c'] |
| カンマでつなぐ | ",".join(["a", "b", "c"]) |
'a,b,c' |
| 区切りなしでつなぐ | "".join(["a", "b", "c"]) |
'abc' |
| 改行でつなぐ | "\n".join(["a", "b"]) |
'a\nb' |
| 数値のリストをつなぐ | ",".join(map(str, [1, 2, 3])) |
'1,2,3' |
| 余分な空白を1個にそろえる | " ".join(" a b ".split()) |
'a b' |
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Python splitとjoinの使い方|文字列の分割と結合まとめ」
splitとjoinは逆向きの操作
最初に全体像をつかみましょう。splitは「文字列 → リスト」、joinは「リスト → 文字列」 です。書き方の主語が違う点だけ意識すると、迷いにくくなります。
| メソッド | 主語(ドットの左) | 引数 | 戻り値 |
|---|---|---|---|
| split | 分割したい文字列 | 区切り文字 | リスト |
| join | 区切り文字 | つなぎたいリストなど | 文字列 |
flowchart LR
A["文字列 'a,b,c'"] -- "split(',')" --> B["リスト ['a','b','c']"]
B -- "','.join(...)" --> A
次のコードは、分割して結合し直すと元に戻ることを確かめるものです。
text = "りんご,みかん,ぶどう"
items = text.split(",") # 文字列 → リスト
print(items)
joined = ",".join(items) # リスト → 文字列
print(joined)
print(joined == text)
実行結果:
['りんご', 'みかん', 'ぶどう']
りんご,みかん,ぶどう
True
joinは「区切り文字.join(リスト)」という語順です。items.join(",") と書きたくなりますが、リストにjoinメソッドはありません。「つなぐ役の文字列が主語になる」 と覚えておくと書きやすくなります。
文字列を分割する:splitの基本
区切り文字を指定して分割する
文字列.split(区切り文字) と書くと、区切り文字の位置で切り分けたリストが返ります。区切り文字そのものは結果に含まれません。区切り文字は1文字でなくてもよく、", " や "->" のような複数文字も指定できます。
print("2026-10-03".split("-"))
print("東京 -> 名古屋 -> 大阪".split(" -> "))
print("a,b,,c".split(",")) # 区切りが連続すると空文字が入る
print("abc".split(",")) # 区切りが見つからなければ要素1つのリスト
year, month, day = "2026-10-03".split("-") # 複数の変数に受け取る
print(year, month, day)
実行結果:
['2026', '10', '03']
['東京', '名古屋', '大阪']
['a', 'b', '', 'c']
['abc']
2026 10 03
区切り文字を指定した場合、区切りが連続すると間に空文字 '' が入ります。 CSVのように「値が空の列」を表したいときに都合のよい動きです。
元の文字列は変更されません。Pythonの文字列は作ったあとに書き換えられない(イミュータブルな)型なので、splitもjoinも新しい値を返します。結果は変数で受け取りましょう。
引数なしのsplit()は空白類でまとめて分割する
引数を省略した split() は、スペース・タブ・改行・全角スペースなどの空白類を区切りとして扱い、連続した空白を1つの区切りとみなします。 先頭と末尾の空白も無視されます。
print(" apple banana\tcherry\n".split())
print("東京 大阪 名古屋".split()) # 全角スペースも区切りになる
print("1 2 3".split()) # 分割後の要素は文字列
print([int(x) for x in "1 2 3".split()]) # 数値にしたいときは変換する
実行結果:
['apple', 'banana', 'cherry']
['東京', '大阪', '名古屋']
['1', '2', '3']
[1, 2, 3]
splitの結果は必ず文字列のリストです。数値として計算したいときは、int() や float() で変換します。
split()とsplit(" ")の違いは連続した空白で出る
split() と split(" ") は似ていますが、空白が2個以上続いたときと、先頭・末尾に空白があるときに結果が変わります。
s = "a b c" # a と b の間は空白2個
print(s.split())
print(s.split(" "))
t = " a b " # 前後に空白2個ずつ
print(t.split())
print(t.split(" "))
実行結果:
['a', 'b', 'c']
['a', '', 'b', 'c']
['a', 'b']
['', '', 'a', 'b', '', '']
| 比べる点 | split()(引数なし) |
split(" ")(半角スペース指定) |
|---|---|---|
| 区切りになる文字 | 空白類すべて(スペース・タブ・改行・全角スペースなど) | 半角スペース1個だけ |
| 連続した空白 | 1つの区切りとしてまとめる | 1個ずつ区切り、間に '' が入る |
| 先頭・末尾の空白 | 無視する | '' として残る |
"a b c" の結果 |
['a', 'b', 'c'] |
['a', '', 'b', 'c'] |
| 向いている場面 | 人が入力した文章、整形が不ぞろいな文字列 | 空の項目も位置として残したいデータ |
人が入力した文字列や、空白の数がそろっていないログを単語に分けるなら、引数なしの split() が扱いやすい選択です。 一方、「スペース区切りで3列目が空」という情報を残したい場合は split(" ") が向いています。
空文字を分割したときの結果
空文字 "" を分割したときの結果も、引数の有無で変わります。ファイルの空行や、入力が空だったときの動きに関わるので、押さえておくと安心です。
print("".split()) # 引数なし
print("".split(",")) # 区切り文字あり
print(" ".split()) # 空白だけの文字列
print(" ".split(" ")) # 空白だけ + 半角スペース指定
print(len("".split()), len("".split(",")))
実行結果:
[]
['']
[]
['', '', '', '']
0 1
| 元の文字列 | split() |
split(",") |
|---|---|---|
""(空文字) |
[](空のリスト) |
[''](空文字が1つ入ったリスト) |
" "(空白だけ) |
[] |
[' '] |
区切り文字を指定すると、空文字からも「要素1個のリスト」が返ります。 そのため len(line.split(",")) で列数を数える処理は、空行でも1になります。空行を除きたいときは、分割の前に if line.strip(): のように中身があるかを確かめるとすっきり書けます。
lines = ["a,b,c", "", "d,e"]
for line in lines:
if not line.strip(): # 空行は読み飛ばす
continue
print(line.split(","))
実行結果:
['a', 'b', 'c']
['d', 'e']
なお、区切り文字に空文字を渡すことはできません。1文字ずつに分けたいときは list() を使います。
print(list("abc"))
"a,b".split("")
実行結果:
['a', 'b', 'c']
Traceback (most recent call last):
File "sample.py", line 3, in <module>
"a,b".split("")
ValueError: empty separator
分割する回数を決める:maxsplit・rsplit・partition
maxsplitで分割回数の上限を決める
split(区切り文字, maxsplit) の第2引数に回数を渡すと、その回数だけ分割し、残りは最後の要素にまとめて入ります。 結果の要素数は最大で「maxsplit + 1」個です。
s = "a,b,c,d"
print(s.split(",", 1))
print(s.split(",", maxsplit=2))
print(s.split(",", 10)) # 上限が多くても、区切りの数までしか分割しない
log = "2026-10-03 09:15:02 INFO user login: id=42"
date, time, level, message = log.split(" ", 3)
print(date, "|", time, "|", level, "|", message)
print(" a b c".split(maxsplit=1)) # 引数なし + maxsplit はキーワードで渡す
実行結果:
['a', 'b,c,d']
['a', 'b', 'c,d']
['a', 'b', 'c', 'd']
2026-10-03 | 09:15:02 | INFO | user login: id=42
['a', 'b c']
ログの例では、4つ目以降にも空白が含まれますが、maxsplit=3 にしたことでメッセージ部分が1つの要素として残っています。「前から何個かだけ取り出し、残りはそのまま持っておきたい」 ときに便利です。
rsplitで右側から分割する
rsplit は右(末尾)から数えて分割します。maxsplitを指定しない場合は split と同じ結果になり、maxsplitと組み合わせたときに違いが出ます。
s = "a,b,c,d"
print(s.split(",", 1))
print(s.rsplit(",", 1))
print(s.rsplit(",")) # 回数を指定しなければ split と同じ
filename = "report.2026.tar.gz"
print(filename.rsplit(".", 1)) # 最後のドットで分ける
path = "/home/taro/docs/memo.txt"
folder, name = path.rsplit("/", 1) # フォルダとファイル名に分ける
print(folder, "|", name)
実行結果:
['a', 'b,c,d']
['a,b,c', 'd']
['a', 'b', 'c', 'd']
['report.2026.tar', 'gz']
/home/taro/docs | memo.txt
ファイルパスや拡張子を本格的に扱うときは、標準ライブラリの pathlib や os.path が用意されています。文字列として手早く切り分けたい場面では rsplit が手軽です。
partitionで「最初の区切りの前後」に分ける
partition(区切り文字) は、最初に見つかった区切り文字で 「前・区切り文字・後ろ」の3要素のタプル を返します。区切りが見つからないときも必ず3要素になるので、代入がエラーで止まりません。
print("key=a=b".partition("="))
print("key=a=b".rpartition("=")) # 最後の区切りで分ける
print("novalue".partition("=")) # 区切りがなくても3要素
key, sep, value = "name=Taro".partition("=")
print(key, value)
# split で2つの変数に受けると、区切りがない行で止まる
key, value = "novalue".split("=", 1)
実行結果:
('key', '=', 'a=b')
('key=a', '=', 'b')
('novalue', '', '')
name Taro
Traceback (most recent call last):
File "sample.py", line 9, in <module>
key, value = "novalue".split("=", 1)
^^^^^^^^^^
ValueError: not enough values to unpack (expected 2, got 1)
| 目的 | 書き方 | 区切りがないときの結果 |
|---|---|---|
| 最初の区切りで2つに分けたい | s.split("=", 1) |
要素1個のリスト(2変数への代入はValueError) |
| 最初の区切りで分け、いつも同じ形で受けたい | s.partition("=") |
('novalue', '', '') |
| 最後の区切りで分けたい | s.rsplit("=", 1) または s.rpartition("=") |
rpartitionは ('', '', 'novalue') |
行ごとに分割する:splitlines
複数行の文字列を行のリストにしたいときは splitlines() を使います。\n と \r\n のどちらの改行も行の区切りとして扱い、末尾の改行による空要素が残りません。
text = "a\nb\r\nc\n" # \n と \r\n が混ざった文字列
print(text.splitlines())
print(text.split("\n")) # \r が残り、最後に '' が付く
print(text.splitlines(keepends=True)) # 改行を残したいとき
print("".splitlines())
実行結果:
['a', 'b', 'c']
['a', 'b\r', 'c', '']
['a\n', 'b\r\n', 'c\n']
[]
| 比べる点 | splitlines() |
split("\n") |
|---|---|---|
\r\n(Windows形式の改行) |
1つの改行として扱う | \r が要素の末尾に残る |
| 末尾が改行で終わるとき | 余分な要素は付かない | 最後に '' が付く |
| 空文字 | [] |
[''] |
| 改行を残す | keepends=True で可能 |
できない |
Python公式ドキュメントの str.splitlines の項には、行の区切りとして扱う文字の一覧(\n、\r、\r\n のほか、\v、\f、\x1c〜\x1e、\x85、Unicodeの行区切り文字・段落区切り文字)が載っています。テキストを行に分ける用途なら、splitlines() を選ぶと改行コードの違いを意識せずに済みます。
複数の区切り文字で分割する:re.split
str.split に渡せる区切りは1種類です。「カンマでもセミコロンでもスラッシュでも区切りたい」というように区切り文字が複数あるときは、正規表現モジュールの re.split を使います。 正規表現とは、文字列のパターンを表す書き方のことです。
import re
# 1) カンマ・セミコロン・スラッシュのどれでも区切る
print(re.split(r"[,;/]", "a,b;c/d"))
# 2) カンマと空白が続いていても、まとめて1つの区切りにする
print(re.split(r"[,\s]+", "a, b c,d"))
# 3) カンマの前後の空白ごと区切りにする
print(re.split(r"\s*,\s*", "a , b,c"))
# 4) 区切り文字も結果に残す(パターンを丸かっこで囲む)
print(re.split(r"([,;])", "a,b;c"))
# 5) 分割回数の上限は maxsplit で指定する
print(re.split(r"[,;]", "a,b;c;d", maxsplit=1))
# 6) 複数文字の区切りは縦棒で並べる
print(re.split(r" and | or ", "a and b or c"))
実行結果:
['a', 'b', 'c', 'd']
['a', 'b', 'c', 'd']
['a', 'b', 'c']
['a', ',', 'b', ';', 'c']
['a', 'b;c;d']
['a', 'b', 'c']
| パターン | 意味 | 使いどころ |
|---|---|---|
[,;/] |
角かっこ内のどれか1文字 | 区切り文字が何種類かあるとき |
[,\s]+ |
カンマまたは空白類が1個以上続いたもの | 区切りが連続・混在しているとき |
\s*,\s* |
前後に空白が付いていてもよいカンマ | 分割と同時に前後の空白を落としたいとき |
([,;]) |
丸かっこで囲むと区切りも結果に入る | どの区切りで分かれたかを残したいとき |
区切り文字が2種類程度で、正規表現を使うほどでもないときは、replaceで1種類にそろえてからsplitする方法もあります。
print("a,b;c".replace(";", ",").split(","))
実行結果:
['a', 'b', 'c']
re.split を使うときに気をつけたいのが、文字列の先頭や末尾に区切りがある場合です。str.split(",") と同じく空文字が入るので、不要なら内包表記で取り除きます。
import re
parts = re.split(r"[,;]", ",a;b,")
print(parts)
print([p for p in parts if p]) # 空文字を除く
実行結果:
['', 'a', 'b', '']
['a', 'b']
分割メソッドの選び方
ここまでの分割方法を、選ぶ基準で整理します。
| 分けたい内容 | 選ぶもの | 戻り値 |
|---|---|---|
| 単語(空白の数は不ぞろい) | s.split() |
リスト |
| 決まった区切り文字1種類 | s.split(",") |
リスト |
| 前から数個だけ取り、残りはまとめる | s.split(",", n) |
リスト |
| 後ろから数個だけ取る(拡張子など) | s.rsplit(".", 1) |
リスト |
| 「キー=値」を必ず同じ形で受ける | s.partition("=") |
3要素のタプル |
| 行 | s.splitlines() |
リスト |
| 区切り文字が複数ある | re.split(パターン, s) |
リスト |
| 1文字ずつ | list(s) |
リスト |
| 引用符つきのCSV | csv モジュール |
リスト(行ごと) |
文字列を結合する:joinの基本
区切り文字.join(リスト)で1つの文字列にする
区切り文字.join(イテラブル) と書くと、要素の間に区切り文字をはさんで1つの文字列にします。イテラブルとは、リストやタプルのように要素を順に取り出せるものの総称です。
words = ["a", "b", "c"]
print(",".join(words))
print("".join(words)) # 区切りなし
print(" - ".join(words)) # 区切りは複数文字でもよい
print("\n".join(words)) # 改行でつなぐ
print(repr(",".join([]))) # 空のリスト → 空文字
print(repr(",".join(["a"]))) # 要素1個 → 区切りは付かない
実行結果:
a,b,c
abc
a - b - c
a
b
c
''
'a'
区切り文字は要素と要素の「間」にだけ入り、先頭や末尾には付きません。 末尾に改行が必要なときは、"\n".join(lines) + "\n" のように足します。
joinに渡せるもの:タプル・文字列・辞書・ジェネレータ式
joinにはリスト以外も渡せます。文字列を渡すと1文字ずつ、辞書を渡すとキーが対象になります。
print("/".join(("home", "taro", "docs"))) # タプル
print("-".join("abc")) # 文字列は1文字ずつ
print(",".join({"id": 1, "name": "Taro"})) # 辞書はキー
print(",".join(w.upper() for w in ["a", "b"])) # ジェネレータ式
print(" ".join(sorted({"b", "a", "c"}))) # 集合は並び順を決めてから
実行結果:
home/taro/docs
a-b-c
id,name
A,B
a b c
集合(set)は要素の順番が決まっていないため、sorted() で並べてから渡すと毎回同じ結果になります。
数値リストを渡すとTypeErrorになる → map(str, ...)で直す
joinでよく出会うのが、数値のリストを渡したときのエラーです。joinがつなげられるのは文字列の要素だけなので、数値が混ざっているとTypeErrorで止まります。まずエラーを再現します。
nums = [1, 2, 3]
print(",".join(nums))
実行結果:
Traceback (most recent call last):
File "sample.py", line 2, in <module>
print(",".join(nums))
^^^^^^^^^^^^^^
TypeError: sequence item 0: expected str instance, int found
エラー文の sequence item 0: expected str instance, int found は、「0番目の要素は文字列であるはずが、intが見つかった」 という意味です。item のあとの番号が、原因になった要素の位置を示しています。たとえば ["a", 2, "c"] なら sequence item 1 と表示されます。
直し方は、要素を文字列に変換してからjoinに渡すことです。書き方は2通りあります。
nums = [1, 2, 3]
print(",".join(map(str, nums))) # map で全要素に str を適用
print(",".join(str(n) for n in nums)) # ジェネレータ式で変換
prices = [1200, 980.5, 300]
print(" / ".join(f"{p:,.1f}円" for p in prices)) # 書式を付けたいときは f-string
実行結果:
1,2,3
1,2,3
1,200.0円 / 980.5円 / 300.0円
| 書き方 | 向いている場面 |
|---|---|
",".join(map(str, nums)) |
そのまま文字列にするだけでよいとき。短く書ける |
",".join(str(n) for n in nums) |
変換の内容が読み取りやすい。条件や加工を足しやすい |
",".join(f"{n:03d}" for n in nums) |
ゼロ埋めや桁区切りなど、書式を指定したいとき |
Noneが混ざっているときの直し方
データベースやファイルから読み込んだ値には、Noneが混ざることがあります。この場合も同じTypeErrorになるので、Noneをどう表すかを決めて変換します。
row = ["a", None, "c"]
try:
print(",".join(row))
except TypeError as e:
print("TypeError:", e)
print(",".join(x or "" for x in row)) # None を空文字にする
print(",".join("" if x is None else str(x) for x in row)) # 0 などを残したいとき
print(",".join(x for x in row if x is not None)) # None を取り除く
実行結果:
TypeError: sequence item 1: expected str instance, NoneType found
a,,c
a,,c
a,c
x or "" は短く書けますが、0 や False も空文字に変わります。数値の0を残したいデータでは、2つ目の "" if x is None else str(x) の形が合っています。
ループの+=とjoinの比べ方
文字列をつなぐ方法には + や += もあります。少ない個数なら + や f-string が読みやすく、リストにたまった多数の文字列をまとめてつなぐならjoin が向いています。
import timeit
parts = [str(i) for i in range(10000)]
def by_plus():
s = ""
for p in parts:
s += p
return s
def by_join():
return "".join(parts)
print(by_plus() == by_join())
print("+= :", round(timeit.timeit(by_plus, number=200), 3), "秒")
print("join:", round(timeit.timeit(by_join, number=200), 3), "秒")
実行結果(時間は環境と実行のたびに変わります。この環境での一例です):
True
+= : 0.065 秒
join: 0.011 秒
1万個の文字列を200回つなぐ計測では、joinのほうが短い時間で終わりました。速度だけでなく、「区切り文字が末尾に余る」という悩みが起きない点もjoinの良さです。
| つなぎ方 | 向いている場面 |
|---|---|
a + b、f-string |
2〜3個の値を決まった形でつなぐとき |
区切り.join(リスト) |
個数が決まっていない、または多いとき。区切り文字をはさみたいとき |
print(*items, sep=",") |
画面に表示するだけでよいとき(文字列への変換も自動) |
CSV1行を分割して加工し、結合し直す
splitとjoinを組み合わせた代表例として、CSVの1行を列に分け、値を加工し、また1行に戻す流れを見てみます。備品の在庫データ(品番, 品名, 数量, 単価)を例にします。
line = "1001, ノート ,3,120\n"
# 1) 末尾の改行を取り、カンマで分割する
cols = line.rstrip("\n").split(",")
print(cols)
# 2) 各列の前後の空白を取り除く
cols = [c.strip() for c in cols]
print(cols)
# 3) 加工する:数量を2増やし、小計の列を足す
cols[2] = str(int(cols[2]) + 2)
cols.append(str(int(cols[2]) * int(cols[3])))
print(cols)
# 4) カンマで結合して1行に戻す
new_line = ",".join(cols)
print(new_line)
実行結果:
['1001', ' ノート ', '3', '120']
['1001', 'ノート', '3', '120']
['1001', 'ノート', '5', '120', '600']
1001,ノート,5,120,600
流れを表にすると次のとおりです。
| 手順 | 使うもの | ポイント |
|---|---|---|
| 1. 改行を取る | rstrip("\n") |
取らないと最後の列に \n が残る |
| 2. 分割する | split(",") |
結果はすべて文字列 |
| 3. 空白を落とす | 内包表記 + strip() |
列ごとに前後の空白を整える |
| 4. 計算する | int() で数値にして計算 |
計算後は str() で文字列に戻す |
| 5. 結合する | ",".join(cols) |
文字列以外が残っているとTypeError |
手順4で str() に戻しておくことが、手順5のjoinをスムーズに通すコツです。 数値のままリストに入れると、前の章で見たTypeErrorになります。
複数行をまとめて処理する場合は、splitlines() で行に分け、最後に "\n".join() で戻します。
data = """1001,ノート,3,120
1002,ペン,10,80
1003,ファイル,2,250"""
result = []
for line in data.splitlines():
code, name, qty, price = line.split(",")
total = int(qty) * int(price)
result.append(",".join([code, name, qty, price, str(total)]))
print("\n".join(result))
実行結果:
1001,ノート,3,120,360
1002,ペン,10,80,800
1003,ファイル,2,250,500
値にカンマが含まれるCSVはcsvモジュールを使う
split(",") は、どのカンマも区切りとして扱います。"ペン,赤" のように引用符で囲まれた値の中にカンマがあるCSVでは、標準ライブラリの csv モジュールが引用符を解釈して正しく分けてくれます。
import csv
import io
line = '1002,"ペン,赤",5,80\n'
print(line.rstrip("\n").split(",")) # split では値が2つに分かれる
row = next(csv.reader(io.StringIO(line))) # csv モジュールなら1つの値として読める
print(row)
buf = io.StringIO()
csv.writer(buf, lineterminator="\n").writerow(row) # 書き戻すと引用符も付け直される
print(repr(buf.getvalue()))
実行結果:
['1002', '"ペン', '赤"', '5', '80']
['1002', 'ペン,赤', '5', '80']
'1002,"ペン,赤",5,80\n'
| データの形 | 選ぶもの |
|---|---|
| 値にカンマ・改行・引用符が含まれない単純な区切りテキスト | split(",") と ",".join() |
| 引用符で囲まれた値がある、表計算ソフトから出力したCSV | csv モジュール |
よく使う組み合わせレシピ
splitとjoinを組み合わせると、短いコードで文字列を整えられます。どれもコピーしてそのまま動きます。
余分な空白を1個にそろえる
s = " Python split join "
print(" ".join(s.split()))
実行結果:
Python split join
引数なしの split() が前後と連続の空白をまとめて落とし、joinが半角スペース1個でつなぎ直します。
単語の順番を逆にする・先頭を大文字にしてつなぐ
words = "the quick brown fox".split()
print(" ".join(reversed(words)))
print("-".join(w.capitalize() for w in words))
print("".join(w[0].upper() for w in words)) # 頭文字だけ集める
実行結果:
fox brown quick the
The-Quick-Brown-Fox
TQBF
スネークケースとキャメルケースを変換する
name = "user_account_id"
head, *rest = name.split("_")
print(head + "".join(w.capitalize() for w in rest)) # userAccountId
print("".join(w.capitalize() for w in name.split("_"))) # UserAccountId
実行結果:
userAccountId
UserAccountId
「キー=値」の並びを辞書にする・辞書を文字列に戻す
query = "page=2&sort=name&order=asc"
params = dict(pair.split("=", 1) for pair in query.split("&"))
print(params)
back = "&".join(f"{k}={v}" for k, v in params.items())
print(back)
print(back == query)
実行結果:
{'page': '2', 'sort': 'name', 'order': 'asc'}
page=2&sort=name&order=asc
True
外側を & で、内側を = で分割しています。値の中に = が含まれても崩れないよう、内側は split("=", 1) と分割回数を1回にしています。URLのクエリ文字列を本格的に扱う場合は、標準ライブラリの urllib.parse が用意されています。
1行に並んだ数値を合計する
line = "10 20 30 40"
nums = [int(x) for x in line.split()]
print(nums, sum(nums))
print(" + ".join(map(str, nums)), "=", sum(nums))
実行結果:
[10, 20, 30, 40] 100
10 + 20 + 30 + 40 = 100
行ごとに番号を付けて組み立て直す
text = "買い物\n掃除\n洗濯"
numbered = [f"{i}. {line}" for i, line in enumerate(text.splitlines(), start=1)]
print("\n".join(numbered))
実行結果:
1. 買い物
2. 掃除
3. 洗濯
つまずきやすいポイントと対処の一覧
実行して確認できたエラーや、意図と違う結果になりやすい箇所をまとめます。
| 起きること | 原因 | 対処 |
|---|---|---|
TypeError: sequence item 0: expected str instance, int found |
joinに数値などが入ったリストを渡した | map(str, ...) で文字列に変換する |
AttributeError: 'list' object has no attribute 'join' |
リスト.join(",") と書いた |
",".join(リスト) の語順にする |
ValueError: empty separator |
split("") と空文字を区切りにした |
1文字ずつなら list(s) を使う |
ValueError: not enough values to unpack |
分割結果の個数が変数の個数より少ない | partition を使う、または個数を確かめてから代入する |
結果に '' が混ざる |
split(" ") で空白が連続、または先頭・末尾に区切りがある |
split() にする、または空文字を内包表記で除く |
要素の末尾に \r が残る |
\r\n の文字列を split("\n") で分けた |
splitlines() を使う |
最後の列に \n が残る |
改行を取らずに分割した | rstrip("\n") してから分割する |
| 値の途中で分かれる | 引用符つきCSVを split(",") で分けた |
csv モジュールを使う |
2つ目の AttributeError は次のように再現できます。
items = ["a", "b", "c"]
print(items.join(","))
実行結果:
Traceback (most recent call last):
File "sample.py", line 2, in <module>
print(items.join(","))
^^^^^^^^^^
AttributeError: 'list' object has no attribute 'join'
よくある質問
Q. split()とsplit(" ")はどちらを使えばよいですか?
A. 単語に分けたいだけなら、引数なしの split() が扱いやすいです。連続した空白やタブ、前後の空白をまとめて処理してくれます。split(" ") は半角スペース1個ごとに区切るので、空の項目を位置として残したいデータに向いています。
Q. 複数の区切り文字で分割するにはどうすればよいですか?
A. re.split(r"[,;/]", s) のように、角かっこの中に区切り文字を並べた正規表現を使います。区切りが連続する場合は [,\s]+ のように + を付けるとまとめて1つの区切りになります。区切りが2種類ほどなら、replace で1種類にそろえてから split する方法も手軽です。
Q. joinで「expected str instance, int found」と出ます。
A. joinがつなげられるのは文字列だけなので、数値やNoneが含まれるとTypeErrorになります。",".join(map(str, nums)) のように、文字列に変換してから渡してください。エラー文の item のあとの番号が、原因の要素の位置です。
Q. 文字列を1文字ずつに分割したいです。
A. list("abc") で ['a', 'b', 'c'] になります。split("") は ValueError: empty separator になるため使えません。逆に1文字ずつのリストを文字列に戻すときは "".join(chars) です。
まとめ
- splitは「文字列 → リスト」、joinは「リスト → 文字列」 の逆向きの操作。joinは
区切り文字.join(リスト)の語順で書く split()は連続した空白をまとめ、split(" ")は1個ずつ区切って''を残す。空文字の分割も[]と['']で結果が変わる- 分割回数は maxsplit、右からは rsplit、必ず3要素で受けたいときは partition を使う
- 行の分割は
splitlines()。\nと\r\nの両方に対応し、末尾に空要素が残らない - 複数の区切り文字は
re.split。[,;/]や[,\s]+のパターンで指定する - joinに数値を渡すとTypeError。
map(str, ...)やジェネレータ式で文字列に変換してからつなぐ - CSV1行の加工は「rstrip → split → 加工 → strで戻す → join」 の順。引用符つきのCSVは
csvモジュールに任せる
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Python splitとjoinの使い方|文字列の分割と結合まとめ」
株式会社RJCでは、Pythonの文字列処理を仲間と学び合っています。こうした知識を共有しながら、日々技術を磨いています。
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。