PythonでExcelのセルの文字数をカウントして上限を超える行を見つける手順|商品名の長さを確かめる
Excelの商品名の文字数をpandasのstr.lenで数え、決めた上限を超える行だけを一覧にする手順を解説します。前後の空白・空欄・半角カタカナ・ちょうど上限の行でつまずく点を、架空の商品の一覧で試しました。
目次
この記事でわかること
- 商品名のようなセルの文字数を、列ごとにまとめて数える方法(str.len)
- 決めた上限を超える行だけを、別のファイルに書き出す書き方
- 前後の空白・空欄・数字だけのセルで、数え方がずれる理由
- 全角と半角、半角カタカナの濁点の数え方
ネットショップの商品名やWebページの見出しには、「20文字以内」のような長さの決まりがよくあります。Excelの一覧を1行ずつ見てLEN関数で確かめるのは、件数が多いと手間がかかります。この記事では、pandasで商品の一覧を読み込んで商品名の文字数の列を作り、上限を超えた行だけを別のファイルに出すところまでを、手元で試した結果とあわせて順に説明します。
参照したのは、pandas 3.1.0の公式の資料のうちSeries.str.len・Series.str.strip・Series.str.encodeの3つと、文字のデータの扱い方をまとめたユーザーガイドで、2026年11月4日に原文で確かめました。商品コードや商品名は、どれも試すために用意した架空のものです。
先に結論: 前後の空白を除いてからstr.lenで数え、上限と比べる
商品名の列にstr.strip().str.len()を使うと、行ごとの文字数の列ができます。 その列を上限の数と比べて、超えた行だけを選びます。空欄や数字だけのセルは数えられずに空(NaN)になるので、上限の確認とは別に拾います。
| やりたいこと | 書き方 | 試した一覧での結果 |
|---|---|---|
| 文字数を数える | str.strip().str.len() | 前後の空白つきの行が11文字から7文字に |
| 上限を超える行を選ぶ | 文字数の列 > 20 | 11行から2行 |
| 上限ちょうども含める | 文字数の列 >= 20 | 3行 |
| 数えられなかった行を拾う | 文字数の列.isna() | 空欄と数字だけの2行 |
str.lenとstr.stripのしくみ
pandasの資料では、str.lenは列の要素ごとの長さを数えるもので、文字列なら文字の数を返すと説明しています。資料の例では、数字の5のような文字列でない値の結果はNaNになり、NaNが混ざるため、結果の列は小数の型(float64)になっています。
str.stripは、それぞれの文字列の左右の端から、空白(改行を含む)を取り除きます。資料には、文字列でない値はNaNに置きかえるとも書かれています。ユーザーガイドでも、strで使う文字列の処理は、空の値を自動で除いて扱うとしています。
1文字として数えられるもの
str.lenは、目に見える幅ではなく、文字の数を数えます。全角の「U」も半角の「U」も1文字です。前後や途中の空白、セルの中の改行も、それぞれ1文字に数えられます。半角カタカナの「ボ」は、「ホ」と濁点の「゙」の2文字です。
ショップや入力欄によっては、全角を2、半角を1として数える決まりもあります。その場合は、文字をバイトの並びに直すstr.encodeを先に使ってから長さを数えます。
手順: 商品の一覧から20文字を超える商品名を書き出す
次のコードは、架空の商品の一覧 shohin.xlsx を読み込み、商品名が20文字を超える行を shohin_chouka.xlsx に書き出します。元の shohin.xlsx は書きかえません。ファイルの名前・列の名前・上限の数は、自分の一覧に合わせて変えて使います。
import pandas as pd
limit = 20 # 商品名の上限の文字数
shohin = pd.read_excel("shohin.xlsx") # 読むだけで、上書きはしない
# 前後の空白を除いてから、商品名の文字数を数える
shohin["文字数"] = shohin["商品名"].str.strip().str.len()
over = shohin[shohin["文字数"] > limit]
print("読み込んだ行:", len(shohin))
print(f"{limit}文字を超える行:", len(over))
print(over[["商品コード", "商品名", "文字数"]].to_string(index=False))
print("数えられなかった行:", shohin.loc[shohin["文字数"].isna(), "商品コード"].tolist())
over.to_excel("shohin_chouka.xlsx", index=False)
最後のprintでは、文字数がNaNになった行の商品コードを出しています。上限との比べ方では選ばれない行なので、件数と一緒に画面で見ておきます。pandasでxlsxを扱うので、openpyxlも入れておいてください。
試した結果
商品コードと商品名の2列で、データの行が11行の架空の一覧で動かしました。商品名には、前後に空白を2つずつ付けた「モニターアーム」、全角で書いた「USBハブ 4ポート」と半角で書いた「USBハブ 4ポート」、半角カタカナの「ワイヤレスキーボード」、ちょうど20文字の「ステンレス保温マグカップ 350ml蓋付」を入れ、1行は空欄、1行は数字の50210だけにしました。
- 「読み込んだ行: 11」「20文字を超える行: 2」と表示されました
- 選ばれたのは、22文字のノートPCスタンドと、26文字のポータブルSSDの2行でした
- 「数えられなかった行: ['A-05', 'A-10']」と出ました。空欄の行と、数字だけの行です
- 全角の「USBハブ 4ポート」も半角の「USBハブ 4ポート」も、同じ10文字でした
- 「ワイヤレスキーボード」は、全角で書くと10文字の商品名ですが、12文字と数えられました
- shohin_chouka.xlsx は3列・2行で、文字数の列は22と26でした
- 実行の前後で shohin.xlsx のハッシュ値を比べ、同じであることを確かめました
試した環境は手元のMac(pandas 3.1.0、Python 3.12.15、openpyxl 3.1.5)です。書き出したファイルの中身は、Excelのアプリではなくopenpyxlで読み直して確かめました。
自分で直してよいか、相談するかの判断
目安は、「長さの決まりが、どの数え方で決まっているか」です。社内の一覧の見やすさのために自分で決めた上限なら、上のコードで見つけた行を自分で縮めてかまいません。
ショップや広告の入稿のように、相手の仕組みが文字数を数える場合は、全角と半角の扱い、空白や記号を数えるかどうかが、仕組みごとに違います。先に入稿先の決まりを確かめ、同じ数え方になっているかを、1件か2件を実際に入れて比べておきます。商品名を縮めるときは、検索で使われる語を消してよいかを、売り場の担当の人と相談します。
つまずきやすいところ
- 前後の空白も数えられる: str.stripを付けずに数えると、前後に空白を2つずつ付けた「モニターアーム」は11文字になりました。stripの後は7文字です。見た目でわからない空白で上限を超えないよう、先に取り除きます
- 空欄と数字だけのセルが確認から漏れる: 文字数がNaNになった空欄の行と50210の行は、「> 20」でも「<= 20」でも選ばれませんでした。isnaで別に拾います。数字も文字として数えたいときは、astype(str)で文字に直すと、50210は5文字と数えられました
- 半角カタカナが長く数えられる: 「ワイヤレスキーボード」は、濁点の「゙」が別の1文字になるため12文字でした。半角カタカナを全角に直してから数えるなら、PythonでExcelの表の文字の前後の空白と全角・半角をそろえる手順で直せます
- ちょうど上限の行が選ばれない: 「> 20」では、ちょうど20文字の保温マグカップは選ばれませんでした。上限ちょうどを「入りきらない」と扱う決まりなら、「>= 20」にします
- 文字数が「22.0」のように小数になる: NaNの行が混ざると、文字数の列は小数の型になりました。書き出したファイルでは22と26の整数で入っていましたが、画面の表示では22.0になります
- 空欄の行を先に調べたい: どの列のどの行が空欄かを先に洗い出すなら、PythonでExcelの表の空欄を見つけて一覧にする手順の手順が使えます
- 長さで区分の列を付けたい: 「短い」「ちょうどよい」「長すぎる」のように、文字数の範囲で区分の列を作るなら、PythonでExcelの複数の条件から区分の列を作る手順のやり方が使えます
まとめ
- 文字数は、str.strip().str.len()で前後の空白を除いてから数えます
- 上限との比べ方(「>」か「>=」か)は、決まりに合わせて選びます
- 空欄や数字だけのセルはNaNになるので、isnaで別に確かめます
- 全角も半角も1文字です。全角を2と数える決まりなら、str.encodeでバイトに直して数えます
よくある質問
上限を超えた行を書き出すときに、元のExcelのファイルへ書き込みはありますか?
ありません。読み込んだ一覧から選んだ行を、shohin_chouka.xlsx という名前で別に保存するだけです。試したときも、元の shohin.xlsx のハッシュ値は実行の前後で同じでした。
全角を2、半角を1として数える決まりのときは、どうしますか?
str.encodeで文字をバイトの並びに直してから、str.lenで長さを数える方法があります。日本語の文字を2バイト、英数字を1バイトで表す cp932 を使うと、試した一覧では、全角の「USBハブ 4ポート」が19、半角の「USBハブ 4ポート」が15になりました。cp932で表せない文字があると、エラーで止まります。
空欄の行も、上限の確認と一緒に見つけられますか?
文字数の列にisnaを使うと、数えられなかった行がわかります。試した一覧では、商品名が空欄の行と、数字だけが入った行の2行が選ばれました。空欄を詳しく調べる方法は、関連記事にまとめています。
上限ちょうどの文字数の行も、一緒に選びたいときは?
比べる記号を「>」から「>=」に変えます。試した一覧で上限を20文字にすると、「>」では2行、「>=」ではちょうど20文字の保温マグカップを含む3行が選ばれました。
セルの中の改行も1文字に数えられますか?
数えられます。str.lenは改行の記号も1つの文字として数えます。str.stripは文字列の両端の空白と改行を取り除きますが、文字列の途中の改行は残るので、途中に改行がある商品名は、その分だけ長く数えられます。