- Python
Python printの使い方|改行なしend・sep・書式指定の早見表
Pythonのprintとは、渡した値を文字列に変換して画面(標準出力)に表示する組み込み関数で、print(値1, 値2, sep=" ", end="\n", file=None, flush=False) の形で使います。 値はカンマで区切っていくつでも渡せ、既定では値のあいだに半角スペース、最後に改行が入ります。
この記事では、sep・end・file・flush の4つの引数を出力結果つきの表にまとめ、改行なしの出力、リストの中身をまとめて出す print(*list, sep=",")、\r を使った進捗表示、標準エラーやファイルへの出力を、コピーしてそのまま動かせるコードで紹介します。後半では f-string の書式指定(桁区切り・小数桁・ゼロ埋め・寄せ・%表示・日付・= によるデバッグ表記)を早見表にし、文字列と数値を + でつないだときの TypeError も再現します。コードと出力は、すべて Python 3.14.7 で実際に動かした結果です。
printの早見表
4つの引数:sep・end・file・flush
出力欄の ↵ は改行を表します。
| 引数 | 既定値 | 役割 | 書き方の例 | 出力 |
|---|---|---|---|---|
| (指定なし) | — | スペース区切り+末尾で改行 | print("A", "B") |
A B↵ |
sep |
" "(半角スペース) |
値と値のあいだに入れる文字 | print("A", "B", sep=",") |
A,B↵ |
sep |
同上 | 区切りなしでつなげる | print("A", "B", sep="") |
AB↵ |
end |
"\n"(改行) |
最後に付ける文字 | print("A", "B", end="") |
A B |
end |
同上 | 改行の代わりに別の文字 | print("A", "B", end="!\n") |
A B!↵ |
file |
None(sys.stdout) |
出力先 | print("A", file=sys.stderr) |
標準エラーに A↵ |
flush |
False |
すぐに書き出すかどうか | print("A", flush=True) |
A↵(ためずにすぐ表示) |
やりたいこと別の書き方
a = [1, 2, 3] の場合の出力です。
| やりたいこと | 書き方 | 出力 |
|---|---|---|
| 改行なしで出力 | print("A", end="") |
A |
| スペース区切りで横に並べる | print("A", end=" ") |
A |
| 空行を1行出す | print() |
↵ |
| カンマ区切りで出力 | print(1, 2, 3, sep=",") |
1,2,3↵ |
| 1つずつ改行して出力 | print(1, 2, 3, sep="\n") |
1↵2↵3↵ |
| リストをそのまま出力 | print(a) |
[1, 2, 3]↵ |
| リストの中身だけを出力 | print(*a) |
1 2 3↵ |
| リストをカンマ区切りで | print(*a, sep=",") |
1,2,3↵ |
| リストを1行ずつ | print(*a, sep="\n") |
1↵2↵3↵ |
| 文字列と数値を並べる | print("合計", 10) |
合計 10↵ |
| 文字列に数値を埋め込む | print(f"合計{10}件") |
合計10件↵ |
| 同じ文字を繰り返す | print("-" * 10) |
----------↵ |
| タブ区切りで出力 | print("A", "B", sep="\t") |
A(タブ)B↵ |
| 引用符つきで確認する | print(repr("A B")) |
'A B'↵ |
f-stringの書式指定
f"{値:書式}" の形で、表示の桁や形式を指定できます。結果は空白の位置がわかるように引用符つきで示しています。例で使う値は次のとおりです。
import datetime
n = 1234567
x = 3.14159
s = "abc"
r = 0.256
d = datetime.datetime(2026, 10, 3, 9, 5, 7)
| やりたいこと | 書き方 | 結果 |
|---|---|---|
| 3桁ごとにカンマ | f"{n:,}" |
'1,234,567' |
| 3桁ごとにアンダースコア | f"{n:_}" |
'1_234_567' |
| 小数点以下2桁 | f"{x:.2f}" |
'3.14' |
| 小数点以下なし | f"{x:.0f}" |
'3' |
| カンマ+小数2桁 | f"{n:,.2f}" |
'1,234,567.00' |
| ゼロ埋め(5桁) | f"{42:05}" |
'00042' |
| ゼロ埋め(小数を含めて8桁) | f"{x:08.3f}" |
'0003.142' |
| 右寄せ(幅8) | f"{s:>8}" |
' abc' |
| 左寄せ(幅8) | f"{s:<8}" |
'abc ' |
| 中央寄せ(幅8) | f"{s:^8}" |
' abc ' |
| 記号で埋めて中央寄せ | f"{s:*^9}" |
'***abc***' |
| 数値を幅8で右寄せ | f"{42:8}" |
' 42' |
| パーセント表示 | f"{r:.1%}" |
'25.6%' |
| 符号を必ず付ける | f"{42:+}" |
'+42' |
| 16進数・2進数 | f"{255:x}"、f"{5:b}" |
'ff'、'101' |
| 接頭辞つき16進数 | f"{255:#x}" |
'0xff' |
| 指数表記 | f"{n:.2e}" |
'1.23e+06' |
| 日付(年-月-日) | f"{d:%Y-%m-%d}" |
'2026-10-03' |
| 日付と時刻 | f"{d:%Y/%m/%d %H:%M:%S}" |
'2026/10/03 09:05:07' |
| 日本語の日付 | f"{d:%Y年%m月%d日}" |
'2026年10月03日' |
| デバッグ表記(変数名=値) | f"{n=}" |
'n=1234567' |
| デバッグ表記+書式 | f"{x=:.2f}" |
'x=3.14' |
| 引用符つき(repr) | f"{s!r}" |
"'abc'" |
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Python printの使い方|改行なしend・sep・書式指定の早見表」
printの基本
値を表示する・複数の値を並べる
print("Hello") # 文字列
print(123) # 数値
print(3.14, True, None) # 型が違っても、カンマで区切れば並べられる
print("件数:", 5, "件") # 値のあいだには自動でスペースが入る
print() # 引数なしは改行だけ(空行)
print("終わり")
実行結果:
Hello
123
3.14 True None
件数: 5 件
終わり
カンマで区切って渡した値は、それぞれ文字列に変換されてからスペース区切りで並びます。 数値と文字列が混ざっていても、型をそろえる必要はありません。
printの定義を確認する
対話モードで help(print) を実行すると、引数の一覧を確認できます。Python 3.14.7 での表示は次のとおりです。
help(print)
実行結果:
Help on built-in function print in module builtins:
print(*args, sep=' ', end='\n', file=None, flush=False)
Prints the values to a stream, or to sys.stdout by default.
sep
string inserted between values, default a space.
end
string appended after the last value, default a newline.
file
a file-like object (stream); defaults to the current sys.stdout.
flush
whether to forcibly flush the stream.
| 引数 | 意味 |
|---|---|
*args |
表示したい値。いくつでも渡せる |
sep |
値のあいだに入れる文字列(既定は半角スペース) |
end |
最後の値のあとに付ける文字列(既定は改行) |
file |
出力先のオブジェクト(既定は現在の sys.stdout) |
flush |
True にすると、ためずにすぐ書き出す |
sep 以降の4つは、必ず 名前=値 の形(キーワード引数)で指定します。 名前を付けずに渡すと、表示したい値の1つとして扱われます。
print("A", "B", ",") # "," は3つ目の値として表示される
print("A", "B", sep=",") # sep= を付けると区切り文字になる
実行結果:
A B ,
A,B
printの戻り値はNone
print は画面に表示するだけで、値を返しません。変数に入れると None になります。
result = print("表示される")
print(result)
text = "A" + "B" # 文字列を作りたいときは、print ではなく式や f-string を使う
print(text)
実行結果:
表示される
None
AB
sepで区切り文字を変える
print("2026", "10", "03") # 既定は半角スペース
print("2026", "10", "03", sep="-") # ハイフン区切り
print("2026", "10", "03", sep="/") # スラッシュ区切り
print("2026", "10", "03", sep="") # 区切りなし
print("りんご", "みかん", sep="、") # 2文字以上や全角文字でもよい
print("A", "B", "C", sep=" -> ")
print("1行目", "2行目", sep="\n") # 改行で区切る
実行結果:
2026 10 03
2026-10-03
2026/10/03
20261003
りんご、みかん
A -> B -> C
1行目
2行目
sep が入るのは「値と値のあいだ」だけで、先頭や末尾には付きません。値が1つしかないときは、sep を指定しても出力は変わりません。
print("A", sep=",") # 値が1つなので区切りは入らない
print([1, 2, 3], sep=",") # リストは「1つの値」。中身は区切られない
print(*[1, 2, 3], sep=",") # * を付けると3つの値として渡される
実行結果:
A
[1, 2, 3]
1,2,3
2行目は、リストの中身を sep で区切るつもりで書かれやすい形です。リスト全体が1つの値として渡されるので、sep は使われません。中身を区切りたいときは、次の章で紹介する * を使います。
endで改行なしにする・末尾を変える
改行なしで続けて出力する
print("読み込み中", end="")
print("...", end="")
print("完了") # ここで初めて改行される
for i in range(5):
print(i, end=" ") # スペース区切りで横に並べる
print() # ループのあとで改行を1回入れる
print("次の行")
実行結果:
読み込み中...完了
0 1 2 3 4
次の行
end="" を付けると改行されず、次の print の出力が同じ行に続きます。 ループで横に並べたあとは、print() を1回呼んで改行しておくと、続く出力が同じ行につながりません。
末尾に好きな文字を付ける
print("項目A", end=" / ")
print("項目B", end=" / ")
print("項目C")
print("区切り線の前", end="\n\n") # 改行を2つにして空行を入れる
print("区切り線の後")
print("A", "B", "C", sep=", ", end=".\n") # sep と end は同時に使える
実行結果:
項目A / 項目B / 項目C
区切り線の前
区切り線の後
A, B, C.
末尾の区切りを残さずに並べる
ループで end="," を使うと、最後の値のあとにもカンマが付きます。区切りを「あいだ」だけに入れたいときは、sep を使う書き方が合っています。
nums = [1, 2, 3]
for n in nums:
print(n, end=",") # 最後にもカンマが付く
print()
print(*nums, sep=",") # あいだだけに入る
print(",".join(str(n) for n in nums)) # 文字列として作ってから出力する方法
実行結果:
1,2,3,
1,2,3
1,2,3
リストの中身をまとめて出力する:print(*list, sep=",")
アンパックで値をばらして渡す
リストの前に * を付けると、要素が1つずつ別々の引数として渡されます(アンパック)。print(*[1, 2, 3]) は print(1, 2, 3) と同じ意味です。
nums = [10, 20, 30]
names = ["Aoki", "Baba", "Chiba"]
print(nums) # リストの形のまま(角かっことカンマ付き)
print(*nums) # スペース区切り
print(*nums, sep=",") # カンマ区切り
print(*nums, sep=", ") # カンマ+スペース
print(*names, sep="\n") # 1行に1つずつ
print(*names, sep=" / ", end=" 以上\n")
print("結果:", *nums) # ほかの値と混ぜてもよい
実行結果:
[10, 20, 30]
10 20 30
10,20,30
10, 20, 30
Aoki
Baba
Chiba
Aoki / Baba / Chiba 以上
結果: 10 20 30
join との違い
区切り文字でつなぐ方法としては "区切り".join(リスト) もあります。join は要素がすべて文字列である必要があり、数値が入っていると TypeError になります。
nums = [10, 20, 30]
try:
print(",".join(nums))
except TypeError as e:
print("TypeError:", e)
print(",".join(map(str, nums))) # 文字列に変換してから join
print(*nums, sep=",") # print なら変換が要らない
実行結果:
TypeError: sequence item 0: expected str instance, int found
10,20,30
10,20,30
| 比べる点 | print(*a, sep=",") |
",".join(a) |
|---|---|---|
| 数値のリスト | そのまま使える | map(str, a) で文字列に変換する |
| 結果を変数に入れる | できない(表示するだけ) | できる(文字列が返る) |
| 向いている場面 | 画面やファイルに出すだけ | 文字列として保存・加工したい |
文字列・range・辞書・二次元リストにも使える
print(*"abc") # 文字列は1文字ずつ
print(*range(5), sep="-") # range
print(*{"a": 1, "b": 2}) # 辞書はキーが渡される
print(*{"a": 1, "b": 2}.items()) # (キー, 値) の組
table = [[1, 2, 3], [4, 5, 6]]
print(*table, sep="\n") # 行ごとに改行
for row in table:
print(*row, sep="\t") # 行の中身をタブ区切りで
実行結果:
a b c
0-1-2-3-4
a b
('a', 1) ('b', 2)
[1, 2, 3]
[4, 5, 6]
1 2 3
4 5 6
fileで出力先を変える:標準エラー・ファイル
標準エラーに出力する
file=sys.stderr を指定すると、通常の出力(標準出力)とは別の経路である標準エラーに書き出せます。処理結果は標準出力、進行状況や警告のメッセージは標準エラーと分けておくと、結果だけをファイルに保存したいときに便利です。
import sys
print("処理結果: 42") # 標準出力
print("警告: 入力が空でした", file=sys.stderr) # 標準エラー
実行結果:
処理結果: 42
警告: 入力が空でした
画面では両方が表示されますが、標準出力だけをファイルに保存すると違いがわかります。
python err_demo.py > result.txt
echo "--- result.txt の中身 ---"
cat result.txt
実行結果:
警告: 入力が空でした
--- result.txt の中身 ---
処理結果: 42
1行目の「警告」は標準エラーなので画面に表示され、result.txt には標準出力の「処理結果」だけが保存されました。
ファイルに出力する
open() で開いたファイルを file= に渡すと、print と同じ書き方でファイルに書き込めます。
members = ["Aoki", "Baba", "Chiba"]
with open("members.txt", "w", encoding="utf-8") as f:
print("会員一覧", file=f)
print(*members, sep="\n", file=f)
print("合計", len(members), "名", file=f)
with open("members.txt", encoding="utf-8") as f: # 書き込んだ内容を確認
print(f.read(), end="")
実行結果:
会員一覧
Aoki
Baba
Chiba
合計 3 名
with を使うと、ブロックを抜けたときにファイルが自動で閉じられます。 sep や end も画面への出力と同じように働くので、改行の入れ方をそのまま使い回せます。追記したいときは "w" を "a" に変えます。
出力を文字列として受け取る
io.StringIO を渡すと、print の出力を文字列として取り出せます。テストで出力内容を確かめたいときに使えます。
import io
buf = io.StringIO()
print("A", "B", sep="-", file=buf)
print("C", file=buf)
text = buf.getvalue()
print(repr(text)) # 改行も含めて確認できる
実行結果:
'A-B\nC\n'
| 出力先 | 書き方 | 用途 |
|---|---|---|
| 画面(標準出力) | print("...") |
通常の出力 |
| 標準エラー | print("...", file=sys.stderr) |
警告・進行状況など、結果と分けたい出力 |
| ファイル | print("...", file=f) |
テキストファイルへの書き出し |
| 文字列 | print("...", file=io.StringIO()) |
出力内容の確認・加工 |
flushと\rで進捗を表示する
flush=Trueですぐに表示する
print の出力は、効率のためにいったんメモリにためてから、まとめて書き出されることがあります(バッファリング)。flush=True を付けると、ためずにその場で書き出します。
違いを確かめるために、「1行出力して1秒待つ」プログラムを別プロセスで動かし、親側に1行目が届くまでの時間を測りました。
import subprocess, sys, time
child = """
import time
print("step1", flush={flag})
time.sleep(1)
print("step2")
"""
for flag in (False, True):
start = time.perf_counter()
p = subprocess.Popen([sys.executable, "-c", child.format(flag=flag)],
stdout=subprocess.PIPE, text=True)
p.stdout.readline() # 1行目が届くまで待つ
elapsed = time.perf_counter() - start
p.wait()
print(f"flush={flag}: 1行目が届くまで 約{elapsed:.0f}秒")
実行結果:
flush=False: 1行目が届くまで 約1秒
flush=True: 1行目が届くまで 約0秒
出力先がパイプ(別のプログラムへの受け渡し)の場合、flush=False では1行目が1秒後(子プロセスの終了時)まで届かず、flush=True ではすぐに届きました。なお、環境変数 PYTHONUNBUFFERED=1 を設定した状態で同じ計測を行うと、flush=False でも約0秒で届きました。プログラムを書き換えずに全体をすぐ書き出す設定にしたいときは、この環境変数が使えます。ログを別のプログラムに渡すときや、end="" で改行せずに進行状況を出すときに flush=True が役立ちます。
| 場面 | flush=True を付けるか |
|---|---|
| 通常の画面出力(改行あり) | 付けなくてよい |
end="" や \r で同じ行に出し続ける |
付ける |
| 出力をパイプやファイルに渡し、すぐ反映させたい | 付ける |
| 大量の行を高速に出力する | 付けない(毎回書き出すぶん遅くなる) |
\rで同じ行を書き換える進捗表示
\r(キャリッジリターン)は「カーソルを行の先頭に戻す」文字です。end="" と組み合わせると、同じ行を上書きしながら進捗を表示できます。
import time
total = 20
for i in range(1, total + 1):
time.sleep(0.1) # 何かの処理の代わり
percent = i / total
bar = "#" * i + "-" * (total - i)
print(f"\r[{bar}] {percent:4.0%}", end="", flush=True)
print() # 最後に改行
print("完了")
端末で実行すると、1行のバーが左から右へ伸びていきます(このコード自体は、記事に動きを載せられないため出力を掲載していません)。代わりに、回数を5回に減らした次のコードを progress.py として保存し、実際に出力された文字の並びを確認しました。
import time
total = 5
for i in range(1, total + 1):
time.sleep(0.05)
bar = "#" * i + "-" * (total - i)
print(f"\r[{bar}] {i / total:4.0%}", end="", flush=True)
print()
print("完了")
\r は画面では見えないので、sed で [CR] という文字に置き換えて表示します。
python progress.py | sed 's/\r/[CR]/g'
実行結果:
[CR][#----] 20%[CR][##---] 40%[CR][###--] 60%[CR][####-] 80%[CR][#####] 100%
完了
[CR] の位置で行頭に戻り、続きの文字が前の表示を上書きします。端末(tmux 3.4)で同じプログラムを動かすと、最後は [#####] 100% の1行と 完了 だけが表示された状態になりました。
| ポイント | 理由 |
|---|---|
文字列の先頭に \r を置く |
行頭に戻ってから書き始める |
end="" を付ける |
改行すると次の行に進んでしまうため |
flush=True を付ける |
改行がないと、表示が遅れることがあるため |
幅をそろえる({:4.0%} など) |
前より短い文字列で上書きすると、前の文字が残るため |
ループのあとで print() |
次の出力が進捗の行につながらないようにする |
上書きで前の文字が残る例と直し方
次のコードを remain.py として保存して動かします。
print("\rcount: 100", end="")
print("\rcount: 5", end="") # 前より短いので、末尾に前の文字が残る
print()
print("\rcount: 100", end="")
print(f"\rcount: {5:<3}", end="") # 幅3で左寄せにして、空白で上書きする
print()
python remain.py | sed 's/\r/[CR]/g'
実行結果:
[CR]count: 100[CR]count: 5
[CR]count: 100[CR]count: 5
端末(tmux 3.4)で表示を確認すると、1行目は count: 500 になりました。count: 5 で上書きしたあとに、前の 00 の2文字が残るためです。幅をそろえた2行目は、空白で上書きされて count: 5 と表示されました。
f-stringで書式を指定する
基本の形
文字列の前に f を付けると、{} の中に変数や式を書けます(f-string、Python 3.6 以降)。コロンのあとに書式を指定します。
name = "Aoki"
count = 3
price = 1980
print(f"{name}さんの注文は{count}点です")
print(f"小計: {price * count:,}円") # 式も書ける
print(f"税込: {price * count * 1.1:,.0f}円") # カンマ区切り+小数なし
print(f"{name=}, {count=}") # = を付けると「名前=値」で表示
実行結果:
Aokiさんの注文は3点です
小計: 5,940円
税込: 6,534円
name='Aoki', count=3
{変数=} の書き方(Python 3.8 以降)は、変数名と値を同時に表示できるので、動作確認のための出力が短く書けます。
書式の並び順
今回、公式ドキュメント(Python 3.14 の string モジュールの「書式指定ミニ言語仕様」)を開いて確認したところ、書式は「オプション(埋め文字・寄せ・符号など)→ 幅と精度 → 型」の順に書くと定義されていました。よく使う部分を並べると次の順です。
{値:[埋め文字][寄せ][符号][0][幅][桁区切り][.精度][型]}
| 部分 | 指定できるもの | 例 |
|---|---|---|
| 埋め文字 | 任意の1文字(寄せと一緒に使う) | *、0、- |
| 寄せ | < 左、> 右、^ 中央、= 符号のあとを埋める |
f"{s:>8}" |
| 符号 | + 常に付ける、- 負だけ(既定)、空白 |
f"{42:+}" |
| 幅 | 全体の最小文字数 | f"{42:8}" |
| 桁区切り | , または _ |
f"{n:,}" |
| 精度 | . と桁数 |
f"{x:.2f}" |
| 型 | d 整数、f 固定小数、e 指数、% 百分率、x 16進、b 2進、s 文字列 |
f"{r:.1%}" |
公式ドキュメントには、% は値を100倍して固定小数点形式でパーセント記号を付けること、, は3桁ごとに区切りを入れること、_ は16進数や2進数では4桁ごとに入ることも書かれています。
桁をそろえて表を出力する
幅と寄せを組み合わせると、列のそろった表を出力できます。文字列は左寄せ、数値は右寄せが既定なので、数値の列は幅を指定するだけで桁がそろいます。
items = [("Pen", 120, 30), ("Notebook", 380, 12), ("Clip", 1500, 4)]
print(f"{'item':<10}{'price':>8}{'qty':>5}{'total':>10}")
print("-" * 33)
for name, price, qty in items:
print(f"{name:<10}{price:>8,}{qty:>5}{price * qty:>10,}")
print("-" * 33)
print(f"{'sum':<10}{sum(p * q for _, p, q in items):>23,}")
実行結果:
item price qty total
---------------------------------
Pen 120 30 3,600
Notebook 380 12 4,560
Clip 1,500 4 6,000
---------------------------------
sum 14,160
日本語などの全角文字は、1文字で画面上2文字ぶんの幅を使います。書式の「幅」は文字数で数えるため、全角文字を含む列は見た目がそろわないことがあります。
for name in ["Pen", "ノート"]:
print(f"[{name:<6}]", len(name))
実行結果:
[Pen ] 3
[ノート ] 3
どちらも6文字ぶんに整えられていますが、等幅フォントで表示すると「ノート」の行のほうが右に長く見えます。全角文字を含む表をそろえたいときは、区切りをタブにするか、表示幅を計算して空白を足す方法があります。
小数の丸めについて
.2f や .0f は表示のときに丸めを行います。ちょうど中間の値は、切り上がるとは限りません。
print(f"{0.5:.0f}", f"{1.5:.0f}", f"{2.5:.0f}")
print(f"{2.675:.2f}")
実行結果:
0 2 2
2.67
0.5 と 2.5 は偶数側に丸められ、2.675 は内部的に 2.675 よりわずかに小さい値として保持されているため 2.67 になります。四捨五入を厳密に行いたいときは、標準ライブラリの decimal モジュールを使います。
format()・%記法との対応
f-string のほかにも、同じ書式を使える書き方があります。既存のコードを読むときのために、対応を並べておきます。
name, score = "Aoki", 92.456
print(f"{name}: {score:.1f}点") # f-string
print("{}: {:.1f}点".format(name, score)) # str.format()
print("%s: %.1f点" % (name, score)) # % 記法
print(name + ": " + format(score, ".1f") + "点") # format() 関数
実行結果:
Aoki: 92.5点
Aoki: 92.5点
Aoki: 92.5点
Aoki: 92.5点
| 書き方 | 例 | 特徴 |
|---|---|---|
| f-string | f"{x:.1f}" |
変数をその場に書けて読みやすい。新しく書くならこれが第一候補 |
str.format() |
"{:.1f}".format(x) |
書式の文字列を先に用意して、あとから値を入れられる |
% 記法 |
"%.1f" % x |
C 言語の printf に近い書き方。logging の引数でも使われる |
format() 関数 |
format(x, ".1f") |
1つの値だけを書式化したいとき |
文字列と数値の連結で起きるTypeError
エラーを再現する
文字列と数値を + でつなぐと、TypeError になります。
age = 30
print("年齢は" + age + "歳です")
実行結果:
Traceback (most recent call last):
File "sample.py", line 2, in <module>
print("年齢は" + age + "歳です")
~~~~~~~~~^~~~~
TypeError: can only concatenate str (not "int") to str
+ は、数値どうしなら足し算、文字列どうしなら連結を行う演算子です。文字列と数値が混ざると、どちらの意味か決められないため、エラーで知らせてくれます。順番が逆(数値が先)のときは、エラー文が変わります。
age = 30
print(age + "歳です")
実行結果:
Traceback (most recent call last):
File "sample.py", line 2, in <module>
print(age + "歳です")
~~~~^~~~~~~~~~
TypeError: unsupported operand type(s) for +: 'int' and 'str'
直し方は4通り
age = 30
print("年齢は", age, "歳です") # 1) カンマで区切る(スペースが入る)
print("年齢は", age, "歳です", sep="") # 2) sep="" でスペースなしにする
print("年齢は" + str(age) + "歳です") # 3) str() で文字列に変換してから連結
print(f"年齢は{age}歳です") # 4) f-string に埋め込む(おすすめ)
実行結果:
年齢は 30 歳です
年齢は30歳です
年齢は30歳です
年齢は30歳です
| 直し方 | 書き方 | 向いている場面 |
|---|---|---|
| カンマで区切る | print("年齢は", age) |
とりあえず値を確認したい |
sep="" を付ける |
print("年齢は", age, "歳", sep="") |
スペースを入れたくない |
str() で変換 |
"年齢は" + str(age) |
文字列として変数に入れたい |
| f-string | f"年齢は{age}歳" |
書式も指定したい。読みやすさを優先したい |
input()の値は文字列
逆に、input() で受け取った値は数字に見えても文字列です。計算に使うときは int() や float() で変換します。ここでは input の代わりに、同じ型の値を変数に入れて確かめます。
text = "5" # input() で「5」と入力した場合と同じ(文字列)
print(text * 3) # 文字列の繰り返しになる
print(int(text) * 3) # 数値に変換してから計算
try:
print(text + 1)
except TypeError as e:
print("TypeError:", e)
実行結果:
555
15
TypeError: can only concatenate str (not "int") to str
改行・タブ・引用符の出力
エスケープシーケンス
print("1行目\n2行目") # \n は改行
print("名前\t年齢") # \t はタブ
print("彼は\"OK\"と言った") # \" はダブルクォート
print('彼は"OK"と言った') # 外側をシングルクォートにすれば \ は要らない
print("C:\\Users\\name") # \\ はバックスラッシュ1つ
print(r"C:\Users\name") # r を付けると \ をそのまま扱う(raw文字列)
実行結果:
1行目
2行目
名前 年齢
彼は"OK"と言った
彼は"OK"と言った
C:\Users\name
C:\Users\name
| 書き方 | 意味 |
|---|---|
\n |
改行 |
\t |
タブ |
\r |
行頭に戻る |
\\ |
バックスラッシュそのもの |
\"、\' |
引用符そのもの |
r"..." |
エスケープを行わない raw 文字列 |
複数行をまとめて出力する
print("""複数行の文字列は
三重クォートで書くと
そのまま出力されます""")
lines = ["A行", "B行", "C行"]
print("\n".join(lines)) # リストを改行でつないで出力
print(*lines, sep="\n") # アンパックでも同じ結果
実行結果:
複数行の文字列は
三重クォートで書くと
そのまま出力されます
A行
B行
C行
A行
B行
C行
strとrepr:見た目が同じ値を見分ける
print は値を str() で変換して表示します。数値の 1 と文字列の "1" は同じ見た目になるので、型を確かめたいときは repr() や f-string の !r を使います。
a, b = 1, "1"
print(a, b) # 見た目では区別できない
print(repr(a), repr(b)) # 文字列には引用符が付く
print(f"{b!r}") # f-string では !r
print([1, "1", " x "]) # リストの中身は repr の形で表示される
print(repr("末尾に空白 ")) # 末尾の空白や改行も見える
実行結果:
1 1
1 '1'
'1'
[1, '1', ' x ']
'末尾に空白 '
そのまま使えるレシピ集
import datetime
import sys
# 1) 区切り線と見出し
print("=" * 30)
print(f"{'集計結果':^26}")
print("=" * 30)
# 2) 番号付きで一覧表示
for no, item in enumerate(["議事録", "手順書", "一覧表"], start=1):
print(f"{no:>2}. {item}")
# 3) 辞書の中身を「キー: 値」で表示
config = {"host": "localhost", "port": 8080, "debug": True}
for key, value in config.items():
print(f"{key:<6}: {value}")
# 4) 九九の一部を表形式で
for i in range(1, 4):
print(*[f"{i * j:2}" for j in range(1, 10)])
# 5) 時刻付きのメッセージ(時刻は固定値を使用)
now = datetime.datetime(2026, 10, 3, 9, 5, 7)
print(f"[{now:%H:%M:%S}] 処理を開始します")
# 6) 条件によって表示を変える
count = 0
print(f"{count}件" if count else "該当なし")
# 7) エラーメッセージを標準エラーへ
print("設定ファイルが見つかりません", file=sys.stderr)
実行結果:
==============================
集計結果
==============================
1. 議事録
2. 手順書
3. 一覧表
host : localhost
port : 8080
debug : True
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
[09:05:07] 処理を開始します
該当なし
設定ファイルが見つかりません
大きな辞書やリストを見やすく表示したいときは、標準ライブラリの pprint が使えます。
from pprint import pprint
data = {"users": [{"id": 1, "name": "Aoki", "tags": ["admin", "dev"]},
{"id": 2, "name": "Baba", "tags": ["dev"]}],
"total": 2}
print(data) # 1行で表示される
pprint(data, width=60) # 幅に合わせて折り返される
実行結果:
{'users': [{'id': 1, 'name': 'Aoki', 'tags': ['admin', 'dev']}, {'id': 2, 'name': 'Baba', 'tags': ['dev']}], 'total': 2}
{'total': 2,
'users': [{'id': 1,
'name': 'Aoki',
'tags': ['admin', 'dev']},
{'id': 2, 'name': 'Baba', 'tags': ['dev']}]}
よくあるエラーと直し方
| エラー文(Python 3.14.7 での出力) | 起きる書き方 | 直し方 |
|---|---|---|
TypeError: can only concatenate str (not "int") to str |
print("年齢" + 30) |
カンマ区切り、または f-string |
TypeError: unsupported operand type(s) for +: 'int' and 'str' |
print(30 + "歳") |
同上 |
TypeError: sep must be None or a string, not int |
sep=1 |
sep="1" と文字列で渡す |
TypeError: print() got an unexpected keyword argument 'sepp'. Did you mean 'sep'? |
引数名の打ち間違い | sep・end・file・flush を確認 |
TypeError: sequence item 0: expected str instance, int found |
",".join([1, 2]) |
print(*a, sep=",") または map(str, a) |
ValueError: Unknown format code 'd' for object of type 'str' |
f"{'abc':d}" |
文字列には d を使わない、int() で変換 |
ValueError: Cannot specify ',' with 's'. |
f"{'1234':,}" |
数値に変換してから :, を使う |
ValueError: I/O operation on closed file |
閉じたファイルに print | with ブロックの中で出力する |
かっこを付けずに print "Hello" と書いた場合は、実行前の文法チェックで次のように表示されます。
print "Hello"
実行結果:
File "paren.py", line 1
print "Hello"
^^^^^^^^^^^^^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
Python 3 の print は関数なので、値を丸かっこで囲みます。エラー文の末尾に直し方の候補が示されるので、そのとおりに print("Hello") と書けば動きます。
printとほかの出力方法の使い分け
| 方法 | 書き方 | 向いている場面 |
|---|---|---|
print(...) |
学習、動作確認、小さなスクリプトの結果表示 | |
| pprint | pprint(data) |
入れ子の辞書・リストを見やすく表示 |
| sys.stdout.write | sys.stdout.write("...\n") |
改行や区切りを自分で完全に制御したい |
| logging | logging.info("...") |
時刻・重要度つきの記録を残す、出力先や量を設定で切り替える |
import sys
n = sys.stdout.write("write は改行を自動で付けません\n")
print(n) # write は書き込んだ文字数を返す
実行結果:
write は改行を自動で付けません
19
動作確認の print が増えてきたら、重要度ごとに出し分けられる logging への切り替えを検討するとよいタイミングです。
書く前のチェックリスト
| 確認すること | 目安 |
|---|---|
文字列と数値を + でつないでいないか |
f-string かカンマ区切りにする |
sep・end を 名前=値 の形で書いているか |
名前がないと表示する値として扱われる |
| リストの中身を区切りたいのに、リストをそのまま渡していないか | * を付けてアンパックする |
end="" のループのあとに print() を入れたか |
次の出力が同じ行につながらないようにする |
進捗表示に flush=True を付けたか |
改行がないと表示が遅れることがある |
| 結果以外のメッセージを標準エラーに分けたか | file=sys.stderr |
| 小数の桁数を指定したか | f"{x:.2f}" |
よくある質問
Q. printで改行しないようにするにはどうすればよいですか?
A. print("文字", end="") のように、end 引数に空文字列を指定します。print は既定で最後に改行(\n)を付けるので、それを空文字列に置き換えるという考え方です。スペースで区切って横に並べたいときは end=" " とし、並べ終わったあとに print() を1回呼んで改行します。
Q. sepとendの違いは何ですか?
A. sep は「値と値のあいだ」に入る文字、end は「最後の値のあと」に付く文字です。print("A", "B", sep="-", end="!\n") は A-B! と表示して改行します。値が1つだけのときは、あいだがないので sep は使われません。
Q. リストをカンマ区切りで表示するにはどうすればよいですか?
A. print(*リスト, sep=",") と書きます。* でリストの要素を1つずつの引数にばらし、sep で区切り文字を指定します。数値のリストでもそのまま使えます。結果を文字列として変数に入れたいときは、",".join(map(str, リスト)) を使います。
Q. printしたのに、すぐに表示されないのはなぜですか?
A. 出力がいったんメモリにためられているためです。end="" で改行しない場合や、出力先がパイプ・ファイルの場合に起きやすくなります。print(..., flush=True) を付けると、その場で書き出されます。
まとめ
- print は
print(値, ..., sep=" ", end="\n", file=None, flush=False)。カンマで区切れば型が違う値も並べられる - 改行なしは
end=""、区切り文字の変更はsep=","。sep は値のあいだ、end は最後に付く - リストの中身は
print(*a, sep=",")でまとめて出力できる。数値のままでよく、join のような変換が要らない file=sys.stderrで標準エラーへ、file=fでファイルへ出力できる- 進捗表示は
\r+end=""+flush=True。幅をそろえると前の文字が残らない - 書式は f-string で指定する。
:,桁区切り、:.2f小数桁、:05ゼロ埋め、:>8寄せ、:.1%パーセント、{変数=}デバッグ表記 - 文字列と数値を
+でつなぐと TypeError。f-string かカンマ区切りにすると、変換を書かずに済む
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Python printの使い方|改行なしend・sep・書式指定の早見表」
株式会社RJCでは、Pythonのprintや書式指定のような基礎文法を仲間と学び合っています。こうした知識を共有しながら、日々技術を磨いています。
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。