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期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?