改行やスペースなしで印刷するには?


1872

私はそれをしたいです 。この例で私がしたいこと

C:

#include <stdio.h>

int main() {
    int i;
    for (i=0; i<10; i++) printf(".");
    return 0;
}

出力:

..........

Pythonの場合:

>>> for i in range(10): print('.')
.
.
.
.
.
.
.
.
.
.
>>> print('.', '.', '.', '.', '.', '.', '.', '.', '.', '.')
. . . . . . . . . .

Pythonではprint\nまたはスペースが追加されますが、どうすればそれを回避できますか?さて、これは単なる例です。最初に文字列を作成してから印刷できるとは言わないでください。文字列をに「追加」する方法を教えてくださいstdout


8
pythonの文字列フォーマットドキュメントを検索する場合:docs.python.org/library/stdtypes.html#string-formatting
guettli

1
以前に同様の質問が行われたように見えます
//stackoverflow.com/q/255147/9325817

回答:


2535

Python 3では、関数のsep=およびend=パラメーターを使用できますprint

文字列の最後に改行を追加しないようにするには:

print('.', end='')

印刷するすべての関数引数の間にスペースを入れないようにするには:

print('a', 'b', 'c', sep='')

任意の文字列をいずれかのパラメーターに渡すことができ、両方のパラメーターを同時に使用できます。

バッファリングに問題がある場合は、flush=Trueキーワード引数を追加して出力をフラッシュできます。

print('.', end='', flush=True)

Python 2.6および2.7

Python 2.6以降でprintは、__future__モジュールを使用してPython 3から関数をインポートできます

from __future__ import print_function

上記のPython 3ソリューションを使用できます。

ただし、このflushキーワードはPython 2 printからインポートされた関数のバージョンでは使用できないことに注意してください__future__。Python 3、より具体的には3.3以降でのみ機能します。以前のバージョンでも、を呼び出して手動でフラッシュする必要がありますsys.stdout.flush()。また、このインポートを行うファイル内の他のすべての印刷ステートメントを書き直す必要があります。

またはあなたが使うことができます sys.stdout.write()

import sys
sys.stdout.write('.')

あなたも呼び出す必要があるかもしれません

sys.stdout.flush()

を確実にstdout即時にフラッシュします。


2
ありがとう!Python 3.6.3では、flush = Trueが重要です。そうでない場合、意図したとおりに機能しません。
gunit

3
誰かがなぜ私がする必要があるのflushか、それが実際に何をするのか説明できますか?
リシャフ2019

5
数か月遅れますが、@ Rishavに応答すると、フラッシュによってバッファが空になり、出力がすぐに表示されます。フラッシュなしでは、最終的に正確なテキストが印刷される可能性がありますが、システムがIOではなくグラフィックスの処理に取り掛かった場合に限られます。Flushは、キャッシュを「フラッシュ」することにより、テキストをすぐに表示します。
グレートタートル

297

これは、Guido Van Rossumがこのリンクで説明したのと同じくらい簡単なはずです。

Re:ac / rなしで印刷する方法は?

http://legacy.python.org/search/hypermail/python-1992/0115.html

何かを印刷することはできますが、キャリッジリターンが自動的に追加されませんか?

はい、印刷する最後の引数の後にコンマを追加します。たとえば、このループは、スペースで区切られた行に0..9の数字を出力します。最後の改行を追加するパラメーターなしの「印刷」に注意してください。

>>> for i in range(10):
...     print i,
... else:
...     print
...
0 1 2 3 4 5 6 7 8 9
>>> 

99
これは、スペースのために望ましくない動作として質問に具体的にリストされています
Zags

87
反対に、答えは2つの理由で削除する必要があります:無効にできない望ましくない副作用があり(余分なスペースが含まれる)、Python 3との前方互換性がありません(括弧はタプルへの変換を強制します)。 。私は、PythonではなくPHPからこの種の粗雑な構造を期待しています。したがって、これを使用しないことが最善です。
Eric Leschinski、2015

9
//、これはPython 2でこれを実行する最も簡単な方法ですが、本当に古いOS向けの単発のコードがたくさんあります。おそらく最善の解決策ではないか、推奨されることすらありません。ただし、StackOverflowの大きな利点の1つは、奇妙なトリックが何であるかを知ることができることです。KDP、@ Eric Leschinskiが言ったことについて上部に簡単な警告を含めますか?結局のところ、それは理にかなっています。
Nathan Basanese 2015

23
@nathanbasanese単純であろうとなかろうと、質問者が明示的に望まないという副作用があります。反対投票。
Shadur

8
具体的には質問に回答しない回答に対する270の賛成票。皆さん、賛成票を投じてください。よくできました。
円筒

168

注:この質問のタイトルは、「Pythonでのprintfの方法」のようなものでした。

人々はタイトルに基づいて探してここに来るかもしれないので、Pythonはprintfスタイルの置換もサポートしています。

>>> strings = [ "one", "two", "three" ]
>>>
>>> for i in xrange(3):
...     print "Item %d: %s" % (i, strings[i])
...
Item 0: one
Item 1: two
Item 2: three

また、文字列値を簡単に乗算できます。

>>> print "." * 10
..........

10
確かに、それはポイントを欠いています。:)質問に対する素晴らしい回答がすでにあったので、私は有用であると思われるいくつかの関連するテクニックについて詳しく説明していました。
Beau

8
質問のタイトルに基づいて、この回答は、C / C ++でprintfを一般的に使用する方法に似ています
Dan

16
これは質問のタイトルには答えますが、本文には答えません。そうは言っても、私が探していたものを提供してくれました。:)
エイマン

2
それは質問に対する答えではありません
Vanuan

4
@Vanuan、質問のタイトルがいつか変わったと私の回答の下部で説明しました。:)
Beau

93

python2.6 +にpython3-style印刷関数を使用します (同じファイル内の既存のキーワード付き印刷ステートメントもすべて無効になります)。

# for python2 to use the print() function, removing the print keyword
from __future__ import print_function
for x in xrange(10):
    print('.', end='')

すべてのpython2印刷キーワードを台無しにしないようにするには、別のprintf.pyファイルを作成します

# printf.py

from __future__ import print_function

def printf(str, *args):
    print(str % args, end='')

次に、ファイルで使用します

from printf import printf
for x in xrange(10):
    printf('.')
print 'done'
#..........done

printfスタイルを示すその他の例

printf('hello %s', 'world')
printf('%i %f', 10, 3.14)
#hello world10 3.140000

39

同じ行に印刷する方法:

import sys
for i in xrange(0,10):
   sys.stdout.write(".")
   sys.stdout.flush()

27

新しい(Python 3.x以降の)print関数にはend、終了文字を変更できるオプションのパラメーターがあります。

print("HELLO", end="")
print("HELLO")

出力:

やあやあ

sepセパレーターもあります:

print("HELLO", "HELLO", "HELLO", sep="")

出力:

ハローハローハロー

これをPython 2.xで使用したい場合は、ファイルの先頭にこれを追加してください:

from __future__ import print_function


1
「sep」は何をしますか?
McPeppr

1
@McPeppr私はこれが古いことを知っていますが、それでも明確にするために答えを編集しました。今すぐ確認してください。
TheTechRobo36414519

編集ありがとうございます。9月は重宝します。これまでのところ、sep.join(list)を使用してリストの要素を区切り記号で連結しました
-csv

21

functools.partialを使用して、printfという新しい関数を作成する

>>> import functools

>>> printf = functools.partial(print, end="")

>>> printf("Hello world\n")
Hello world

関数をデフォルトのパラメーターでラップする簡単な方法。


16

関数,の最後に追加するだけで、print新しい行に出力されません。


1
//、これは実際には何も出力しませんでした。次に、stackoverflow.com / a / 493500/2146138に示すように、最後に引数のない別の印刷ステートメントを追加する必要はありませんか?非常に短い2行または3行の例でこの回答を編集してもよろしいですか?
Nathan Basanese 2015

3
OPはスペースを追加したくない
pppery

2
質問に答えませんでした。場所がない。
shrewmouse

これはもはやPython 2.xでは機能せず、OPが望んでいたものの半分しか答えません。なぜ16票を投じるのですか?
TheTechRobo36414519

12

Python 3+では、printは関数です。あなたが電話するとき

print('hello world')

Pythonはそれを

print('hello world', end='\n')

end好きなように変更できます。

print('hello world', end='')
print('hello world', end=' ')

8

python 2.6+

from __future__ import print_function # needs to be first statement in file
print('.', end='')

python 3

print('.', end='')

python <= 2.5

import sys
sys.stdout.write('.')

各印刷後に余分なスペースが問題ない場合、python 2

print '.',

Python 2で誤解を招く - 回避

print('.'), # avoid this if you want to remain sane
# this makes it look like print is a function but it is not
# this is the `,` creating a tuple and the parentheses enclose an expression
# to see the problem, try:
print('.', 'x'), # this will print `('.', 'x') `

8

あなたが試すことができます:

import sys
import time
# Keeps the initial message in buffer.
sys.stdout.write("\rfoobar bar black sheep")
sys.stdout.flush()
# Wait 2 seconds
time.sleep(2)
# Replace the message with a new one.
sys.stdout.write("\r"+'hahahahaaa             ')
sys.stdout.flush()
# Finalize the new message by printing a return carriage.
sys.stdout.write('\n')

5

次のようにpython3でも同じことができます:

#!usr/bin/python

i = 0
while i<10 :
    print('.',end='')
    i = i+1

python filename.pyまたはそれを実行しますpython3 filename.py


5

最近同じ問題がありました。

私はそれを解決しました:

import sys, os

# reopen stdout with "newline=None".
# in this mode,
# input:  accepts any newline character, outputs as '\n'
# output: '\n' converts to os.linesep

sys.stdout = os.fdopen(sys.stdout.fileno(), "w", newline=None)

for i in range(1,10):
        print(i)

これはunixとwindowsの両方で動作します... macosxではテストしていません...

hth


2
休憩sys.__stdout__
pppery 2016

4

@lenoohは私の質問に満足しました。「python suppress newline」を検索しているときにこの記事を見つけました。Raspberry PiでIDLE3を使用して、PuTTY用のPython 3.2を開発しています。PuTTYコマンドラインにプログレスバーを作成したかったのです。ページがスクロールして離れたくありませんでした。私は、水平線が表示され、ユーザーがプログラムが停止したり、陽気な無限ループで昼食に送られたりしていないことを心配し、ユーザーを安心させたいと思っていました。しかし、これにはしばらく時間がかかる場合があります。インタラクティブなメッセージ-テキストのプログレスバーのようなもの。

print('Skimming for', search_string, '\b! .001', end='')「001」を拭き取ると期間のラインを拡張、⌫⌫⌫ラブアウトの三のバックスペースを印刷する次の画面書き込み、その後、周期の準備によってメッセージを初期化します。search_stringユーザー入力をオウムで処理した後\b!、はsearch_stringテキストの感嘆符をトリミングして、print()それ以外の場合は強制されるスペースを覆い、句読点を適切に配置します。その後にスペースと、シミュレーションしている「進行状況バー」の最初の「ドット」が続きます。不必要に、メッセージはページ番号(先頭がゼロで3の長さにフォーマットされています)で準備され、進行状況が処理されていることをユーザーから通知します。これは、後で作成する期間のカウントも反映します。正しい。

import sys

page=1
search_string=input('Search for?',)
print('Skimming for', search_string, '\b! .001', end='')
sys.stdout.flush() # the print function with an end='' won't print unless forced
while page:
    # some stuff…
    # search, scrub, and build bulk output list[], count items,
    # set done flag True
    page=page+1 #done flag set in 'some_stuff'
    sys.stdout.write('\b\b\b.'+format(page, '03')) #<-- here's the progress bar meat
    sys.stdout.flush()
    if done: #( flag alternative to break, exit or quit)
        print('\nSorting', item_count, 'items')
        page=0 # exits the 'while page' loop
list.sort()
for item_count in range(0, items)
    print(list[item_count])
#print footers here
 if not (len(list)==items):
    print('#error_handler')

プログレスバーの肉がsys.stdout.write('\b\b\b.'+format(page, '03'))並んでいます。まず、左側を消去するには、カーソルを3つの数字の上に「\ b \ b \ b」を⌫⌫⌫消しゴムとしてバックアップし、新しいピリオドをドロップして、進行状況バーの長さに追加します。次に、これまでに進んだページの3桁を書き込みます。sys.stdout.write()は、バッファーがいっぱいになるか出力チャネルが閉じるまで待機するため、sys.stdout.flush()強制的に即時書き込みを行います。sys.stdout.flush()に組み込まれ、print()でバイパスされprint(txt, end='' )ます。次に、コードは平凡な時間のかかる操作をループしますが、ここに戻って3桁をワイプし、ピリオドを追加して、3桁をインクリメントするまで、何も出力しません。

拭き取り、書き換えられた3桁が必要されるものではない-それは例示だけの繁栄ですsys.stdout.write()print()。ピリオドを1つずつ長くするだけでピリオドバーを印刷するだけで、ピリオドで簡単にピリオドを付けて3つのバックスラッシュ-b⌫バックスペース(もちろん、フォーマットされたページ数も書き込まない)を忘れることができます。sys.stdout.write('.'); sys.stdout.flush()ペア。

Raspberry Pi IDLE3 Pythonシェルはバックスペースを⌫ruboutとして受け入れず、代わりにスペースを出力し、代わりに分数の見かけのリストを作成することに注意してください。

—(o = 8>ウィズ


4

上記のすべての答えが正しいことに気づくでしょう。しかし、私は常に "end =" "パラメータを最後に書くショートカットを作りたかったのです。

次のような関数を定義できます

def Print(*args,sep='',end='',file=None,flush=False):
    print(*args,sep=sep,end=end,file=file,flush=flush)

すべての数のパラメーターを受け入れます。それでも、file、flushなど、同じ名前のその他すべてのパラメーターを受け入れます。


動作せず*arg、最初(Python 2.7)で問題があり、最後に置くと動作しましたが、完全に正しく動作しませんでした。私はPrint(*args)、だけをとる関数を定義してから、でprintを呼び出しましたsep='', end=''。そして今、それは私が望むように機能します。アイデアに賛成票を1つ。
Otzen

4

これらの回答の多くは少し複雑に見えます。Python 3.xでは、これを行うだけです。

print(<expr>, <expr>, ..., <expr>, end=" ")

endのデフォルト値はです"\n"。単にスペースに変更するだけですがend=""printf通常はスペースを使用せずに行うこともできます。


3

forループで何かを印刷したいが、毎回新しい行に印刷したくない場合は、次のようになります。例:

 for i in range (0,5):
   print "hi"

 OUTPUT:
    hi
    hi
    hi
    hi
    hi

しかし、あなたはそれをこのように印刷したいです:hi hi hi hi hi hi hi ???? 印刷 "hi"の後にカンマを追加するだけです

例:

for i in range (0,5): print "hi", OUTPUT: hi hi hi hi hi


5
いいえ、OPはhihihihihiではなくhihihihihiを望んでいます
クールジャベリン

1

または次のような関数を持っています:

def Print(s):
   return sys.stdout.write(str(s))

次に今:

for i in range(10): # or `xrange` for python 2 version
   Print(i)

出力:

0123456789

0
for i in xrange(0,10): print '\b.',

これは、2.7.8と2.5.2の両方で機能しました(それぞれ、CanopyとOSX端末)。モジュールのインポートやタイムトラベルは必要ありません。


8
これにより、バックスペース文字が標準出力に出力されます。標準出力がたまたま端末である場合は正しく見えるかもしれませんが、それがファイルにリダイレクトされる場合、そのファイルには制御文字が含まれます。
キース・トンプソン

1
確かに、しかし誰もがローテクプログレスバー以外の何かにこれを使いたいとは想像できません...
面倒な

1
それにもかかわらず、Pythonコードは問題のCコードと同じことを行いません。
キーストンプソン

sys.stdout.isatty()ファイルにリダイレクトされない場合でもテストできます。
fcm

0

これを行うには、一般的に2つの方法があります。

Python 3.xで改行なしで印刷する

printステートメントの後に何も追加せず、次のように使用しend='' て'\ n'を削除します。

>>> print('hello')
hello  # appending '\n' automatically
>>> print('world')
world # with previous '\n' world comes down

# solution is:
>>> print('hello', end='');print(' world'); # end with anything like end='-' or end=" " but not '\n'
hello world # it seem correct output

ループの別の例

for i in range(1,10):
    print(i, end='.')

Python 2.xで改行なしで印刷する

末尾にコンマを追加すると、印刷後は無視され\nます。

>>> print "hello",; print" world"
hello world

ループの別の例

for i in range(1,10):
    print "{} .".format(i),

これがお役に立てば幸いです。このリンクにアクセスできます。


スペースはどうですか?
shrewmouse

使用end=" "例:プリント( 'こんにちは'、終了を= ''「);印刷( '世界')
susan097

2.7ソリューションではスペースは削除されません。
shrewmouse

スペースではなく「\ n」を削除することを述べました。スペースはデフォルトでpython2にあります。何を参照してくださいこのルックス:print 'hello' ;print'there'paiza.io/projects/e/35So9iUPfMdIORGzJTb2NQ
susan097

そう、それがあなたの答えが反対票だった理由です。「改行やスペースを入れずに印刷する方法」という質問には答えませんでした。2.xに対するあなたの答えは質問に答えません。3.0の回答は、9年以上前に投稿された他の多くの回答と同じです。簡単に言うと、この回答はコミュニティに役立つものは何もないため、削除する必要があります。
shrewmouse

-3

...ライブラリをインポートする必要はありません。削除文字を使用するだけです:

BS=u'\0008' # the unicode for "delete" character
for i in range(10):print(BS+"."),

これにより、改行とスペースが削除されます(^ _ ^)*

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.