Pythonのprint()関数はデフォルトで末尾に改行を自動的に追加しますが、改行なしで出力したい場面も多くあります。同じ行に複数の値を横並びで出力したい、プログレスバーを同じ行で更新したい、テーブル形式で整形して表示したいなど、改行を制御した出力処理はPythonプログラミングの実務でよく使うテクニックのひとつです。
Pythonのprint()にはendパラメータが用意されており、デフォルト値の”\n”(改行)を””(空文字)に変えるだけで改行なしの出力が実現できます。sepパラメータとの組み合わせや\rを使った行の上書き表示など、出力の細かい制御方法を合わせて押さえておきましょう。
この記事では、Pythonのprint()で改行なし出力を実現するendパラメータの使い方を、基本から応用パターン・sep・flush・\rとの組み合わせまで、サンプルコードとともにわかりやすく解説していきます。
Pythonのprint()で改行なし出力するにはend=””を指定するのが基本
それではまず、print()で改行なし出力を実現するendパラメータの基本的な使い方について解説していきます。
Pythonのprint()はデフォルトで末尾に”\n”(改行コード)を追加します。endパラメータに空文字””を指定することで改行なしの出力が実現できます。
# デフォルト(改行あり)
print("アボカド")
print("サーモン")
print("ドラゴンフルーツ")
print("---")
# end=""で改行なし出力
print("アボカド", end="")
print("サーモン", end="")
print("ドラゴンフルーツ")
# 出力結果:アボカド
# 出力結果:サーモン
# 出力結果:ドラゴンフルーツ
# 出力結果:---
# 出力結果:アボカドサーモンドラゴンフルーツ
end=””を指定すると末尾の改行が除かれ、次のprint()の出力が同じ行に続きます。最後のprint()だけendを省略(デフォルトの”\n”)にすることで行末に改行を入れられます。
endパラメータに様々な区切り文字を指定する
# endに様々な区切り文字を指定する
items = ["アボカド", "サーモン", "ゴリラ茶", "ロバコーヒー"]
# スペース区切り
for item in items:
print(item, end=" ")
print() # 最後に改行
# カンマ区切り
for item in items:
print(item, end=", ")
print()
# 矢印区切り
for item in items:
print(item, end=" → ")
print("完了")
# 出力結果:アボカド サーモン ゴリラ茶 ロバコーヒー
# 出力結果:アボカド, サーモン, ゴリラ茶, ロバコーヒー,
# 出力結果:アボカド → サーモン → ゴリラ茶 → ロバコーヒー → 完了
endに任意の文字列を指定することで、出力の区切り方を自由にカスタマイズできます。リストの要素を横並びで表示したいときに便利なパターンです。
sepパラメータとの組み合わせ
# sepパラメータは複数の引数の区切り文字を指定する
# endパラメータは行末の文字を指定する
# 複数の値をカンマ区切りで出力
print("アボカド", "サーモン", "キーボード", sep=", ")
# sepとendを組み合わせる
print("ネジ", "ボルト", "ワッシャー", sep=" / ", end=" ← 部品一覧\n")
# ヘッダー行の整形
print("商品名", "価格", "在庫", sep="\t", end="\n")
print("アボカド", "298", "50", sep="\t", end="\n")
print("サーモン", "1200", "20", sep="\t", end="\n")
# 出力結果:アボカド, サーモン, キーボード
# 出力結果:ネジ / ボルト / ワッシャー ← 部品一覧
# 出力結果:商品名 価格 在庫
# 出力結果:アボカド 298 50
# 出力結果:サーモン 1200 20
sepは1つのprint()の複数引数の間に挿入される区切り文字、endは1つのprint()の末尾に付く文字です。2つを組み合わせることで柔軟な出力フォーマットが実現できます。
\rで同じ行を上書き更新する方法
続いては、\r(キャリッジリターン)を使って同じ行を上書き更新する方法を確認していきます。
\r(キャリッジリターン)はカーソルを行頭に戻す制御文字です。\rとend=””を組み合わせることで、同じ行を繰り返し上書きしてプログレス表示やカウントダウンが実現できます。
\rを使ったカウントダウン表示
import time
# \rで同じ行を上書きするカウントダウン
for i in range(5, 0, -1):
print(f"\r残り{i}秒...", end="", flush=True)
time.sleep(0.3) # デモ用に短縮
print("\r完了! ") # スペースで前の文字を消す
# 出力結果(最終状態):完了!
\rを文字列の先頭に付けてend=””で出力すると、カーソルが行頭に戻り次の出力で同じ行が上書きされます。flush=Trueで出力バッファを即時反映させることで、リアルタイムな表示更新が実現できます。
プログレスバーを実装する
import time
def show_progress(total, current, bar_width=20):
filled = int(bar_width * current / total)
bar = "█" * filled + "░" * (bar_width - filled)
percent = current / total * 100
print(f"\r処理中 [{bar}] {percent:.0f}% ({current}/{total})",
end="", flush=True)
total_items = 10
items = ["アボカド", "サーモン", "ドラゴンフルーツ", "ゴリラ茶",
"ロバコーヒー", "キーボード", "マウス", "ネジ", "ボルト", "ワッシャー"]
for i, item in enumerate(items, 1):
show_progress(total_items, i)
time.sleep(0.1)
print("\n全アイテムの処理が完了しました!")
# 出力結果(最終状態):処理中 [████████████████████] 100% (10/10)
# 出力結果:全アイテムの処理が完了しました!
\rと■・░を組み合わせたプログレスバーはCLIツールで視覚的な進捗表示を実現する実用的なパターンです。バー幅・パーセント表示・件数表示を組み合わせることで使いやすい表示になります。
スピナーアニメーションを実装する
import time
import itertools
# スピナーアニメーション
spinner_chars = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"]
spinner = itertools.cycle(spinner_chars)
print("データを処理中です...")
for _ in range(20): # デモ用に20回
char = next(spinner)
print(f"\r{char} 処理中...", end="", flush=True)
time.sleep(0.1)
print("\r✓ 処理が完了しました!")
# 出力結果(最終状態):✓ 処理が完了しました!
itertools.cycle()でスピナー文字を循環させながら\rで同じ行を更新するとアニメーション的な表示が実現できます。時間のかかる処理中にユーザーへのフィードバックを与えたい場面で活躍するパターンです。
flushパラメータの使い方
続いては、print()のflushパラメータの仕組みと使い方を確認していきます。
Pythonのprint()は出力をバッファリング(一時的に溜めてからまとめて出力)する場合があります。flush=Trueを指定するとバッファを即時フラッシュして出力が画面にすぐ反映されます。
flush=Trueが必要な場面
import time
# flushなし(バッファリングにより表示が遅れる可能性がある)
print("処理1開始...", end="")
time.sleep(0.2)
print("完了")
# flush=Trueあり(即座に表示される)
print("処理2開始...", end="", flush=True)
time.sleep(0.2)
print("完了")
# \rと組み合わせる場合はflush=Trueが重要
for i in range(1, 4):
print(f"\r進捗:{i}/3", end="", flush=True)
time.sleep(0.2)
print() # 最後に改行
# 出力結果:処理1開始...完了
# 出力結果:処理2開始...完了
# 出力結果:進捗:3/3
end=””で改行せずに処理を続ける場合やリアルタイム更新を行う場合はflush=Trueを指定して確実に画面に反映させましょう。特に\rを使ったプログレス表示では必須の指定です。
flushを使ったリアルタイムログ出力
import time
def log(message, level="INFO"):
from datetime import datetime
timestamp = datetime.now().strftime("%H:%M:%S")
print(f"[{timestamp}] [{level}] {message}", flush=True)
# リアルタイムにログが出力される
log("アボカドの処理を開始します")
time.sleep(0.1)
log("サーモンのデータを読み込んでいます")
time.sleep(0.1)
log("ドラゴンフルーツの在庫が少なくなっています", level="WARNING")
time.sleep(0.1)
log("全処理が完了しました")
# 出力結果:[14:30:45] [INFO] アボカドの処理を開始します
# 出力結果:[14:30:45] [INFO] サーモンのデータを読み込んでいます
# 出力結果:[14:30:45] [WARNING] ドラゴンフルーツの在庫が少なくなっています
# 出力結果:[14:30:45] [INFO] 全処理が完了しました
flush=Trueをつけたログ関数を用意しておくことで、長時間処理の途中でもリアルタイムにログが表示されます。パイプ経由でファイルにリダイレクトする場合も確実にログが書き出されます。
改行なし出力の応用パターン
続いては、end=””やsepを活用した実践的な応用パターンを確認していきます。
改行の制御を活用することで、テーブル形式の整形表示・縦横を組み合わせたレイアウト・ドット進捗表示など視覚的にわかりやすいCLI出力が実現できます。
テーブル形式で整形して表示する
# テーブル形式で整形して出力する
products = [
("アボカド", 298, 50),
("ドラゴンフルーツ", 498, 30),
("サーモン", 1200, 20),
("ゴリラ茶", 350, 100),
]
# ヘッダーを出力
print(f"{'商品名':<12}{'価格':>8}{'在庫':>6}")
print("-" * 28)
# データ行を出力
for name, price, stock in products:
print(f"{name:<12}{price:>8,}円{stock:>5}個")
# 合計行
total_value = sum(p * s for _, p, s in products)
print("-" * 28)
print(f"{'合計在庫金額':<12}{total_value:>8,}円")
# 出力結果:商品名 価格 在庫
# 出力結果:----------------------------
# 出力結果:アボカド 298円 50個
# 出力結果:ドラゴンフルーツ 498円 30個
# 出力結果:サーモン 1,200円 20個
# 出力結果:ゴリラ茶 350円 100個
# 出力結果:----------------------------
# 出力結果:合計在庫金額 88,840円
f文字列の書式指定(:<で左寄せ、:>で右寄せ、:,で3桁カンマ)を組み合わせることで、テーブル形式の整然としたCLI出力が実現できます。
ドット進捗表示を実装する
import time
# ドットで進捗を表示する
items = ["アボカド", "サーモン", "ドラゴンフルーツ",
"ゴリラ茶", "キーボード", "ネジ"]
print("処理中", end="", flush=True)
for item in items:
time.sleep(0.15)
print(".", end="", flush=True)
print(f" 完了({len(items)}件処理)")
# 出力結果:処理中...... 完了(6件処理)
end=””でドットを横に並べながら処理の進捗を表示するパターンです。シンプルながらも処理が進んでいることをリアルタイムに伝えられます。
複数列を横並びで出力する
# 複数列を横並びで出力する
col1 = ["アボカド", "サーモン", "ゴリラ茶"]
col2 = ["キーボード", "マウス", "モニター"]
col3 = ["ネジ", "ボルト", "ワッシャー"]
print(f"{'食品':<12}{'PC周辺機器':<12}{'部品':<12}")
print("-" * 36)
for a, b, c in zip(col1, col2, col3):
print(f"{a:<12}{b:<12}{c:<12}")
# 出力結果:食品 PC周辺機器 部品
# 出力結果:------------------------------------
# 出力結果:アボカド キーボード ネジ
# 出力結果:サーモン マウス ボルト
# 出力結果:ゴリラ茶 モニター ワッシャー
zip()で複数のリストを横断しながらf文字列の幅指定で列を揃えることで、複数列の整然とした出力が実現できます。
まとめ
この記事では、Pythonのprint()で改行なし出力を実現するendパラメータの使い方について、基本から\rを使ったプログレス表示・flushパラメータ・応用パターンまで幅広く解説しました。
print()のend=""で改行なし出力が実現でき、endには任意の区切り文字を指定できます。sepパラメータとの組み合わせで出力フォーマットをより細かく制御できます。\rとend=""の組み合わせで同じ行を上書き更新するプログレスバーやカウントダウンが実装でき、flush=Trueで即時出力を保証できます。
テーブル形式の整形表示・ドット進捗表示・スピナーアニメーションなど、今回紹介したパターンはCLIツール開発で非常に役立ちます。ぜひ実際のプロジェクトで活用してみてください。