CHAPTER 1 ・ 書き方を一段上げる / Lesson 02
文字列を整える(書式・加工)
桁区切り・桁そろえ・パーセント表示。全角半角や余計な空白の整え方まで、帳票づくりの基本です。
このレッスンが終わったら
「f文字列の書式で、金額や割合の見た目を整えられる。取り込んだ文字は、strip や replace で下ごしらえする」と言える。
こんな場面、ありませんか?
請求の一覧や報告書に、金額や達成率を載せるとき。Pythonで計算した結果を、そのまま表示すると、こうなります。
▶ 実行を押すと、ここに結果が出ます
間違ってはいません。ただ、人が読む資料としては物足りません。
1234567 は桁を数えないと読めず、0.256 は 25.6% と書いてほしく、伝票番号は S0007 のように桁をそろえたいところです。
こうした「見た目」は、f文字列の中に、書式を書き添えると整います。この回では、その書式と、もうひとつ、取り込んだ文字の下ごしらえ(余計な空白、全角と半角の混在)を学びます。
書式を付けて表示してみる
{amount} のように、{ } の中に変数を入れる書き方は、基礎編で使いました。この { } の中に、:(コロン)に続けて書式指定を書くと、見た目を整えられます。
▶ 実行を押すと、ここに結果が出ます
カンマ、パーセント、S0007、小数点以下1桁。思いどおりに整いましたか。表示が変わるだけで、amount や rate の中身(数値)は、変わりません。
次は、金額の桁をそろえる書式です。数字は、右にそろえると、桁の大きさが一目で比べられます。
▶ 実行を押すと、ここに結果が出ます
書式の読み方
{amount:>12,} を、部品に分けてみます。
f"f文字列の始まりamount表示したい変数:ここから書式>右にそろえる1212文字ぶんの幅,3桁ごとにカンマ日本語にすると
よく使う書式を、一覧にしておきます。全部を覚える必要はありません。必要になったら、ここに戻ってきてください。
{x:,}3桁ごとにカンマ(1234567 は 1,234,567){x:,.1f}カンマと小数1桁を、あわせて使う(1234.5678 は 1,234.6){rate:.1%}100倍して、小数1桁のパーセントにする(0.256 は 25.6%){x:05d}5桁になるまで、左を0で埋める(7 は 00007){s:>10}10文字ぶんの幅で、右にそろえる{s:<10}左にそろえる({s:^10} は中央そろえ)ひとつ、注意があります。f"{amount:,}" の結果は、見た目は数字でも文字で、計算には使えません。計算は元の数値で行い、表示するときだけ書式を付けましょう。
日本語と、取り込んだ文字を整える
① 日本語が混ざると、桁がずれる。 customers.csv の得意先名を、左にそろえて並べてみます。
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
地域の位置が、ガタガタになりました。:<12 は「12文字ぶん」の指定ですが、画面では、日本語(全角)は半角の2文字ぶんの幅を取るためです。全角どうしなら、全角のスペースで埋めると、そろいます。
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
ljust(12, " ") は、「12文字になるまで、右に全角スペースを足す」という意味です。ただし、半角の英数字(ノートPC の PC など)が混ざると、また少しずれます。文字をぴったりそろえる表は、画面では割り切り、きれいな帳票が必要なときは Excel に出力します(Lesson 27)。
② 文字の下ごしらえ。 Excelやシステムから取り込んだ文字には、余計な空白や、表記の違いがつきものです。文字には、.strip() のように「文字の後ろに . をつなげて使う道具」が、いろいろ用意されています。これをメソッドと呼びます。
▶ 実行を押すと、ここに結果が出ます
strip() は前後の空白を取り、replace(a, b) は a を b に置き換えます。split は区切りで分けてリストにし、join はリストを1つの文字につなぎます。startswith / endswith / in は、始まり・終わり・含まれているかを True / False で返します。
③ 全角と半角を、そろえる。 銀行の入金明細では、摘要が半角カナで届きます。アオイ と アオイ は、人には同じに見えても、Pythonには別の文字です。標準ライブラリの unicodedata で正規化(表記の統一)をすると、半角カナは全角に、全角の英数字は半角に、そろいます。
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
"NFKC" は正規化の種類の名前で、「半角カナと全角英数字をそろえる」ときは、これで十分です。split(" ", 1) の 1 は「最初の1か所だけで分ける」の意味です。
④ 金額の文字を、数値に直す。 CSVやExcelの金額に、桁区切りのカンマが付いていると、そのままでは数値になりません。
▶ 実行を押すと、ここに結果が出ます
ValueError(値が変換できない)になります。カンマを取ってから変換します。全角数字が混ざっていても、先に正規化しておけば大丈夫です。
▶ 実行を押すと、ここに結果が出ます
⑤ 帳票らしく、まとめる。 請求の一覧を、金額を左端にそろえて並べ、最後に合計を付けます。
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
自分で書く
お題① 変数 total の金額を、合計: 1,320,000円 の形で表示してください。
▶ 実行を押すと、ここに結果が出ます
ヒントを見る
print(f"合計: {total:,}円") の形です。{ } の中の「:,」が桁区切りです。
答えの例を見る
total = 1320000
print(f"合計: {total:,}円")お題② 半角カナの text を、全角に直して表示してください。
▶ 実行を押すと、ここに結果が出ます
ヒントを見る
unicodedata.normalize("NFKC", text) の結果を、print で表示します。
答えの例を見る
import unicodedata
text = "サクラシヨウジ"
print(unicodedata.normalize("NFKC", text))お題③ 文字で書かれた金額 raw を、数値にして合計し、表示してください(全角数字とカンマが混ざっています)。
▶ 実行を押すと、ここに結果が出ます
ヒントを見る
[int(unicodedata.normalize("NFKC", s).replace(",", "")) for s in raw] で数値のリストができます。それを sum で足します。
答えの例を見る
import unicodedata
raw = ["1,200", "3,450", "800"]
amounts = [int(unicodedata.normalize("NFKC", s).replace(",", "")) for s in raw]
print(sum(amounts))仕事ならどう使う?
理解チェックamount が 1234567 のとき、f"{amount:,}円" の表示は、どれでしょう?
理解チェック入金明細の摘要に、半角カナの「アオイ」と、全角の「アオイ」が混ざっていて、突き合わせができません。まず使うのは、どれでしょう?