お悩み女子Excelなら関数で文字をつないだり、一部だけ取り出したりできるけど、Pythonだとどう書くの?
文字列(str型)はPython で文字を扱うための基本のデータです。店舗名、ファイル名、商品コード、メール本文など、業務の自動化で扱うデータの多くが文字列です。
Pythonの文字列の基本操作と、Excelの表記ゆれをそろえる使い方を、動くコードつきで紹介します。載せているコードはWindows 11 と Python 3.12 で動くことを確かめています。
- 文字列の作り方と、つなぎ方(+ と f文字列)
- 一部を取り出すインデックスとスライス
- よく使う文字列メソッド(strip・replace・split・join など)
- つまずきやすい3つの例と直し方
- Excelの商品コードの表記ゆれをそろえる実務の例
Pythonの文字列とは|引用符で囲んだ文字のならび
Python では文字を引用符で囲むと文字列になります。日本語もそのまま書けます。作り方は2通りです。
引用符で作る
シングルクォート(’)とダブルクォート(”)のどちらで囲んでも、同じ文字列になります。文字列の中にダブルクォートを入れたいときは、シングルクォートで囲むと書きやすくなります。
shop = "東京店"
note = '売上は"速報値"です'
print(shop, note)
print(len(shop), type(shop))
実行結果は次のとおりです。
東京店 売上は"速報値"です
3 <class 'str'>
len() は文字数を返します。日本語も1文字を1つと数えるので、「東京店」は3です。type() で調べると str(文字列)と分かります。
複数行の文字列
改行を含む長い文章は三連引用符(”””)で囲むと、そのまま書けます。メール本文の定型文などに向いています。
mail = """お世話になっております。
今月の売上報告です。"""
print(mail)
実行すると、次のように表示されます。
お世話になっております。
今月の売上報告です。
Pythonの文字列の連結|+とf文字列
変数の中身を文章に入れ込む方法は、+ でつなぐ書き方と、f文字列の2つです。
+とf文字列でつなぐ
name = "田中"
amount = 1234567
print("お疲れさまです、" + name + "さん")
print(f"{name}さんの売上は{amount}円です")
出力は次のとおりです。
お疲れさまです、田中さん
田中さんの売上は1234567円です
+ は文字列どうしをつなぎます。f文字列は引用符の前に f を付け、変数を波かっこ { } で囲む書き方です。文が長くなるほど、f文字列のほうが読みやすくなります。
カンマ・小数・ゼロ埋めの書式
波かっこの中の変数の後ろに「:」と書式を付けると、表示の形を整えられます。請求書やレポートの文面づくりで使う場面が多い書き方です。
amount = 1234567
print(f"売上は{amount:,}円です")
print(f"達成率は{0.1234:.1%}です")
for n in [1, 12, 123]:
print(f"No.{n:03d}")
画面には次のように出ます。
売上は1,234,567円です
達成率は12.3%です
No.001
No.012
No.123
:, は3けたごとのカンマ区切り、:.1% は小数を百分率にして小数第1位まで、:03d は整数を3けたにそろえて足りない分を0で埋める指定です。書式の一覧は公式ドキュメントの「書式指定ミニ言語」にまとまっています。
請求メールの文面づくりに使うと、次のように書けます。
customer = "株式会社サンプル"
month = 4
total = 1234567
body = f"{customer} 御中\n{month}月分のご請求額は{total:,}円です。"
print(body)
結果は次のとおりです。
株式会社サンプル 御中
4月分のご請求額は1,234,567円です。
Pythonの文字列の取り出し|インデックスとスライス
商品コード ABC-2026-0042 から、年の部分だけ、連番だけを取り出したい場面があります。位置を数字で指定して取り出します。
1文字を取り出すインデックス
文字列の後ろに [位置] を付けます。位置は0から数え、マイナスの数は後ろから数えます。
code = "ABC-2026-0042"
print(code[0])
print(code[-1])
実行結果は次のとおりです。
A
2
code[0] は先頭の「A」、code[-1] は最後の「2」です。文字数を超える位置を指定すると、IndexError: string index out of range で止まります。
範囲で取り出すスライス
[開始:終了] と書くと、範囲で取り出せます。終了の位置の文字は含まれません。range関数と同じ決まりです。開始か終了を省くと、先頭から、または最後までになります。
code = "ABC-2026-0042"
print(code[:3])
print(code[4:8])
print(code[-4:])
実行すると、次のように表示されます。
ABC
2026
0042
code[4:8] は、位置4から7までの4文字で、年の「2026」です。末尾4文字の連番を取るなら code[-4:] と書きます。
Pythonの文字列メソッド|業務でよく使う7つの操作
文字列には、メソッドと呼ばれる操作が用意されています。文字列.メソッド名() の形で使います。よく使うものを一覧にまとめました。
| メソッド | 働き | 業務での使いどころ |
|---|---|---|
| strip() | 前後の空白を消す | セルに紛れた余分なスペースの除去 |
| replace(旧, 新) | 文字を置き換える | ファイル名の記号の統一 |
| split(区切り) | 区切ってリストにする | カンマ区切りの1行を分ける |
| 区切り.join(リスト) | リストをつなぐ | 複数の店舗名を1つの文にする |
| upper() / lower() | 大文字・小文字にそろえる | 英字コードの表記統一 |
| startswith() / endswith() | 先頭・末尾を調べる | 拡張子 .csv のファイルだけ選ぶ |
| in / find() | 含むか・位置を調べる | ファイル名に月が入っているかの確認 |
空白を消す・置き換える
raw = " 東京支店 "
print(repr(raw.strip()))
filename = "売上_2026-04.csv"
print(filename.replace("_", "-"))
出力は次のとおりです。
'東京支店'
売上-2026-04.csv
strip() は前後の空白だけを消します。空白文字は公式ドキュメントで isspace() の定義とされていて、上の結果のとおり全角スペースも消えます。文字列の途中の空白は消えません。
区切ってリストにする・つなぐ
line = "東京,大阪,名古屋"
cities = line.split(",")
print(cities)
print("/".join(cities))
画面には次のように出ます。
['東京', '大阪', '名古屋']
東京/大阪/名古屋
split(",") は、カンマの位置で文字列を切ってリストにします。リストの扱いは配列の記事で詳しく説明しています。join は逆に、リストの中身を区切り文字でつないで1つの文字列にします。
先頭や末尾・含むかを調べる
filename = "売上_2026-04.csv"
print(filename.startswith("売上"), filename.endswith(".csv"))
print("2026-04" in filename)
print(filename.find("2026"))
print("abc-42".upper())
結果は次のとおりです。
True True
True
3
ABC-42
startswith と endswith は、先頭と末尾が指定した文字列かを True か False で返します。in は含まれているか、find は見つかった位置(見つからなければ -1)を返します。
Pythonの文字列の3つのつまずき|型・書き換え・全角半角
文字列で困りやすいのはエラーで止まるものと、エラーが出ないのに結果が合わないものの2種類です。
数値との連結でTypeError
文字列と数値を + でつなぐと、エラーで止まります。
amount = 1200
print("売上: " + amount + "円")
TypeError: can only concatenate str (not "int") to str
「文字列に数値は連結できない」という意味です。f文字列に直すか、str(amount) で数を文字列に変えてから連結します。
一部の書き換えでTypeError
文字列はあとから一部だけ書き換えられません。公式チュートリアルでも、文字列は変更できない(不変)と説明されています。
code = "ABC-0042"
code[0] = "X"
TypeError: 'str' object does not support item assignment
書き換えたいときは、新しい文字列を作って変数に入れ直します。
code = "ABC-0042"
code = "X" + code[1:]
print(code)
実行結果は次のとおりです。
XBC-0042
replace() や strip() も元の文字列は変えず、新しい文字列を返します。結果を使うには、変数に入れ直します。
全角と半角で一致しない
見た目が同じでも、全角の「ABC」と半角の「ABC」は別の文字です。比較しても、エラーは出ずにFalseが返ります。
import unicodedata
a = "ABC-0042"
b = "ABC-0042"
print(a == b)
print(unicodedata.normalize("NFKC", a) == b)
実行すると、次のように表示されます。
False
True
1つ目が全角と半角をそのまま比べた結果、2つ目が unicodedata.normalize("NFKC", ...) で形をそろえてから比べた結果です。
Pythonの文字列の実務例|Excelの商品コードの表記ゆれをそろえる
最後に、Excelの列に混ざった商品コードの表記ゆれをそろえる例です。Excelを Python から操作するライブラリ openpyxl を使います。入っていない場合は、コマンドプロンプトで pip install openpyxl を実行すると入れられます。
お悩み女子商品コードの表記ゆれ、目で見て直すのが限界になってきた……
なべくん件数が増えるほど見落としが出ます。ルールを決めて、Pythonにそろえさせるのが近道です。
全角を半角にそろえるNFKC
標準ライブラリの unicodedata.normalize() に "NFKC" を指定すると、公式ドキュメントのいう互換等価性にもとづいて文字がそろいます。さきほどの結果のとおり、全角の英数字と記号が半角になります。ここに strip() と upper() を重ねると、空白と大文字小文字のずれも消えます。
Excelの列を整形して別の列に書く
A列に、全角・前後の空白・小文字が混ざった商品コードが並んだ「商品コード.xlsx」を用意しました。1行目は見出しです。整形した結果をB列に書き、別名で保存します。
import unicodedata
from openpyxl import load_workbook
def clean_code(value):
text = unicodedata.normalize("NFKC", str(value)).strip()
return text.upper()
wb = load_workbook("商品コード.xlsx")
ws = wb.active
for row in range(2, ws.max_row + 1):
original = ws.cell(row=row, column=1).value
if original is None:
continue
ws.cell(row=row, column=2, value=clean_code(original))
print(repr(original), "->", ws.cell(row=row, column=2).value)
wb.save("商品コード_整形後.xlsx")
実行すると、A列の元の値と整形後の値が表示されます。
'ABC-0042' -> ABC-0042
' abc-0042 ' -> ABC-0042
'ABC-0042' -> ABC-0042
'xyz-0007\u3000' -> XYZ-0007
全角・空白・小文字が混ざっていた4行が、半角の大文字で同じ形にそろいます。最後の行の \u3000 は全角スペースを表していて、見た目では気づきにくい空白も取り除かれています。
空のセルは continue で飛ばしています。数値が入ったセルがあっても止まらないよう、str(value) で文字列にしてから処理しています。
元のファイルを上書きしないよう、保存するファイル名を変えています。動きを確かめるまでは、コピーしたファイルで試すと元のデータを壊さずに済みます。
Pythonの文字列に関するよくある質問
数値への変換と、文字列の途中にある空白の取り除き方を確認します。
- 「1,200」のようにカンマの入った文字列は、数値にできますか?
-
そのまま
int("1,200")とするとエラーになります。int("1,200".replace(",", ""))のように、カンマを取ってから変換すると1200になります。 - 文字列の途中にある空白も消せますか?
-
strip()は前後だけなので、途中はreplace()を使います。半角と全角の両方を消すなら、text.replace(" ", "").replace(" ", "")と2回書きます。
まとめ|Pythonの文字列は「新しい文字列を作る」と考える
文字列操作のポイントを整理します。
つなぎ方:+ でも書けるが、変数が増えるなら f文字列。カンマ区切りは :, 、ゼロ埋めは :03d。
取り出し方:位置は0から数える。スライス [開始:終了] は終了の文字を含まない。
よく使うメソッド:strip・replace・split・join・upper・startswith・in。
つまずきやすい点:数値との + はエラー。一部の書き換えはできない。全角と半角は別の文字。
業務での使いどころ:unicodedata.normalize で全角を半角にそろえてから、strip と upper で整える。
文字列は元の形を変えず、操作のたびに新しい文字列が返ってくると覚えておくと、書き間違いが減ります。
文字列と一緒に使うことの多い処理は、次の記事でも扱っています。
参考資料
テキスト | Python チュートリアル
文字列メソッド | Python 3 ドキュメント
書式指定ミニ言語 | Python 3 ドキュメント
unicodedata | Python 3 ドキュメント
openpyxl ドキュメント
