Pythonではprint()を使うと標準出力に文字が表示されますが、デフォルトでは末尾に改行が入ります。
この記事ではprint()で改行しないためのend引数の使い方を、初学者の方にもわかりやすいよう段階を踏んで解説します。
連続出力、区切り文字の調整、リアルタイム表示、さらにsys.stdout.write()まで丁寧に紹介します。
Pythonのprint()で改行しない基礎
printはデフォルトで改行する
print()は、引数の内容を表示したあと自動的に改行します。
これはend='\n'(改行文字)が既定値だからです。
# デフォルトでは、print は末尾に改行を付ける(end='\n')
print("A")
print("B")
A
B
end=”で改行しない
末尾の動作はend引数で変えられます。
改行を入れたくない場合はend=''とします。
# 改行を入れずに連続して出力する
print("A", end='') # 改行なし
print("B", end='') # 改行なし
print("C") # ここはデフォルトの改行あり(end='\n')
ABC
end=’ ‘でスペース区切り
スペースで見やすく区切るにはend=' 'を使います。
数字や単語を横並びにしたいときに便利です。
# スペースを入れながら横に並べる
print(1, end=' ')
print(2, end=' ')
print(3) # 行の最後は改行
1 2 3
- 関連記事:文字列の結合と繰り返し
end=’, ‘でカンマ区切り
CSV風に並べたい場合はend=', 'が役立ちます。
見た目を整えつつ、最後は改行するなど柔軟に制御できます。
# カンマ+スペースで区切る
print("apple", end=', ')
print("banana", end=', ')
print("cherry") # 最後に改行
apple, banana, cherry
よく使うend値と効果は次のとおりです。
| end の値 | 行末の動作 | 用途の例 |
|---|---|---|
'\n'(既定) | 改行する | 通常の1行出力 |
'' | 何も付けない | 完全に連結したい |
' ' | スペース1つ | 読みやすい横並び |
', ' | カンマ+スペース | CSV風の見た目 |
連続出力の実例とパターン
ループで横に並べて表示
ループ内でend=''やend=' 'を使うと、数値や文字列を1行に並べられます。
# 0 から 4 までを横に並べて表示
for i in range(5):
print(i, end='') # 改行なし
print() # ループ後に1回だけ改行して行を確定
01234
最後だけ改行する
一連の出力の最後だけ改行したいときは、ループ内で条件分岐してendを切り替えます。
# 要素の間はカンマとスペース、最後の要素だけ改行にする
items = ["A", "B", "C", "D"]
for idx, x in enumerate(items):
is_last = (idx == len(items) - 1)
print(x, end='\n' if is_last else ', ')
A, B, C, D
リアルタイム表示はflush=True
ターミナルや一部の環境ではバッファリングで画面反映が遅れることがあります。
逐次表示したいならflush=Trueを指定します。
進捗表示などで効果的です。
# ドットを0.2秒間隔で即時表示し、最後に done と出す
import time
for _ in range(5):
print('.', end='', flush=True) # flush=True でバッファを都度流す
time.sleep(0.2)
print(' done') # 行を閉じる
..... done
endとsepの違いと組み合わせ
sepで値の間の区切りを変える
sepは引数どうしの間に入る区切り文字を決めます。
既定値は' '(半角スペース)です。
# デフォルトの sep=' ' と、カスタム sep の比較
print("A", "B", "C") # 既定: スペース区切り
print("A", "B", "C", sep='-') # ハイフン区切り
print("2025", "09", "10", sep='/') # 日付の見た目
A B C
A-B-C
2025/09/10
endで行の終わりを制御する
endは行末に付ける文字列です。
改行するか、区切りを付けて次の出力につなぐかを決められます。
# 行末に「; 」を付け、次の print につなげる
print(1, 2, 3, end='; ')
print("next")
1 2 3; next
sepとendを同時に指定する
sepとendは同時に指定できます。
どちらも文字列なので自由に組み合わせられます。
# 値の間はカンマ+スペース、行末はピリオドで終える
print(10, 20, 30, sep=', ', end='.')
# 次の行を続けて出力しても、先ほどの行はピリオドで閉じている
print(" done")
10, 20, 30. done
要点のまとめは次の表が把握しやすいです。
| 引数 | 作用する場所 | 既定値 | 典型例 |
|---|---|---|---|
sep | 値と値の間 | ' ' | sep=', ' でリスト風出力 |
end | 行の末尾 | '\n' | end='' で改行なし、end='; ' で接続 |
応用: print以外で改行しない出力
sys.stdout.writeを使う
sys.stdout.write()は素の書き込みを行い、自動改行や区切りの挿入を一切しません。
必要なら自分で'\n'を書き、リアルタイム反映したい場合はflush()を呼びます。
# sys.stdout.write は改行を自動で付けない
import sys
sys.stdout.write("Hello")
sys.stdout.write("World")
sys.stdout.write("\n") # 自分で改行を書く
# 必要に応じて即時反映
sys.stdout.flush()
HelloWorld
writeとprintの違い
両者の役割は似ていますが、使い勝手と既定動作に違いがあります。
用途に応じて選ぶとよいでしょう。
| 項目 | sys.stdout.write | |
|---|---|---|
| 区切りの自動挿入 | あり(sep) | なし |
| 行末の制御 | endで可 | 文字列に含める必要あり |
| 改行の既定 | あり('\n') | なし |
| フラッシュ | flush=Trueで可 | sys.stdout.flush()を呼ぶ |
| 返り値 | None | 書き込んだ文字数(int) |
| 可読性 | 高い(初心者向け) | 低め(細かく制御したいとき) |
一部のIDEやノートブック環境では出力がバッファリングされ、表示が遅れることがあります。
リアルタイム性が重要ならprint(..., flush=True)またはsys.stdout.flush()を併用してください。
まとめ
改行を入れないprintの鍵はend引数です。
end=''で完全連結、end=' 'やend=', 'で読みやすく整形し、必要に応じてflush=Trueで即時表示にできます。
複数値の区切りはsep、行末はendと役割を分けて覚えると混乱しません。
さらに細かな制御が必要なときはsys.stdout.write()も選択肢になります。
まずは小さなスクリプトで実際に試し、望む出力が得られるまでsepとendを自在に使い分けられるようになると良いです。
