Pythonの同じ行に複数のプリント


229

基本的に次のような出力を表示するスクリプトを実行したいと思います。

Installing XXX...               [DONE]

現在、Installing XXX...最初に印刷してからを印刷します[DONE]

ただし、同じ行に印刷Installing xxx...したいと思い[DONE]ます。

何か案は?



1
この質問に対する回答は見、時にはあなたが行をクリアすることを言及していない:stackoverflow.com/questions/45263205
ideasman42

回答:


284

printステートメントを使用して、インポートせずにこれを行うことができますsys

def install_xxx():
   print "Installing XXX...      ",

install_xxx()
print "[DONE]"

print行の終わりのコンマは、print新しい行を発行しないようにします(出力の最後に余分なスペースがあることに注意してください)。

Python 3ソリューション
上記はPython 3では機能しないため、代わりにこれを行うことができます(ここでも、インポートせずにsys):

def install_xxx():
    print("Installing XXX...      ", end="", flush=True)

install_xxx()
print("[DONE]")

print関数は、endデフォルトのパラメータを受け入れます"\n"。空の文字列に設定すると、行の最後に新しい行が発行されなくなります。


1
それは完全に動作します。これまでにstdoutソリューションしか見ていません。それを知って本当に良かった。
プロメテウス2015年

5
印刷とその間に時間がかかるアクション(すべて同じ関数/インデントレベル)がある場合、これは機能しません。アクションが開始する前は、出力はまったくなく、終了後は全体として出力が表示されます
Paddre

2
これはおそらく、OSがプロセス全体に対して実行する出力バッファリングの機能であり、これはpython固有の問題ではありません。Python固有の回避策については、stackoverflow.com / questions / 107705を参照してください。
複数の

13
改行がなければ、おそらく明示的にバッファをフラッシュしたいでしょう。print("...", end="", flush=True)Python 3で使用し、Python 2でsys.stdout.flush()呼び出しを追加します。
Martijn Pieters

7
python 3.xでは、末尾に「\ r」を追加して、印刷された行VSを末尾に追加するのと置き換えますprint("Progress: {}%".format(var), end="\r", flush=True)
John

103

あなたは単にこれを使うことができます:

print 'something',
...
print ' else',

そして出力は

something else

でやり過ぎる必要はありませんimport sys。最後のコンマ記号に注意してください。

print("some string", end="");最後の改行挿入を削除するPython 3+。続きを読むhelp(print);


3
(注)この方法を使用することにより、2つのスペースがある
ethanjyx

1
これが最も簡単で最も効率的な答えです。
gixxer

これは、printの引数が括弧内にある場合は機能しません。これは機能します:<print "hello" ;; print( "hello")>これは機能しません<print( "hello"、); print( "hello")>
Mayank Jaiswal 2015年

@MayankJaiswalこれは括弧で機能します。print( 'hello')、
drglove

1
printこの関数は3 VSパイソン2にわずかに異なる構文を持つ
boldnik

52

バックスペース ' \ r 'または( ' \ x08を使用する必要がありますコンソール出力の前の位置に戻るに ')文字をます

Python 2+:

import time
import sys

def backspace(n):
    sys.stdout.write((b'\x08' * n).decode()) # use \x08 char to go back   

for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    sys.stdout.write(s)                     # just print
    sys.stdout.flush()                      # needed for flush when using \x08
    backspace(len(s))                       # back n chars    
    time.sleep(0.2)                         # sleep for 200ms

Python 3:

import time   

def backline():        
    print('\r', end='')                     # use '\r' to go back


for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    print(s, end='')                        # just print and flush
    backline()                              # back to the beginning of line    
    time.sleep(0.2)                         # sleep for 200ms

このコードは1行で0%から100%までカウントされます。最終的な値は次のとおりです。

> python test.py
100%

ここでのフラッシュに関する追加情報:'end ='引数を含むpython printステートメントの動作がwhileループで異なるのはなぜですか?


1
明確にするために、この例ではコメントアウトされたコードは、Python 2のためであり、非コメント行は、Python 3のためにあるように見えます
カメが可愛い

1
bouth行はPython 3で正常に動作します。バックスペースとして '\ x08'を使用する場合、出力ストリームをフラッシュする必要があります-print((b '\ x08' * n).decode()、end = ''、flush = True)
Vadim Zin4uk

1
キャリッジリターン '\ r'は行の先頭に戻るため、 '* n'は不要です
bjnortier

43

とを使用sys.stdout.write('Installing XXX... ')sys.stdout.write('Done')ます。このように"\n"、印刷機能を再作成する場合は、手動で新しい行を追加する必要があります。このためだけにcursesを使用する必要はないかもしれないと思います。


4
私は個人的に、投票数の多いソリューションよりもこのソリューションを好み__future__ます。インポートなどに依存する必要なく、python2.xとpython3.xでまったく同じように機能するためです。
mgilson 2013年

17

新しい行が見つかるまですべてが一時停止していたため、どの回答もうまくいきませんでした。私は簡単なヘルパーを書きました:

def print_no_newline(string):
    import sys
    sys.stdout.write(string)
    sys.stdout.flush()

テストするには:

import time
print_no_newline('hello ')
# Simulate a long task
time.sleep(2)
print('world')

「こんにちは」は、スリープする前に、最初に出力して画面にフラッシュします。その後、標準印刷を使用できます。


1
ありがとうございました!まさに.flush()として必要なもの
MrNice


11

最もシンプル:

Python 3

    print('\r' + 'something to be override', end='')

これは、カーソルを最初に戻し、何かを印刷して同じ行で終了することを意味します。ループしている場合は、開始した場所と同じ場所で印刷を開始します。


3
涼しい!Windowsでも動作します。
Shital Shah

2
ありがとうございます。でもそれprint(’something to be override’, end=‘\r’)はもっと簡単だと思います。
Tropilio


9

Printにはオプションのend引数があり、それは最後に印刷されるものです。デフォルトは改行ですが、空の文字列に変更できます。例えばprint("hello world!", end="")


2
これはpython 3にあります。python2では単純にできますprint 'something',。末尾のコンマは、改行の追加を防ぎます。
arjoonn

4

(継続的に追加するのではなく)前の行を上書きする場合は、printステートメントの最後で\rと 組み合わせることができますprint(),。例えば、

from time import sleep

for i in xrange(0, 10):
    print("\r{0}".format(i)),
    sleep(.5)

print("...DONE!")

コンソールの古い番号を置き換えて、0から9までカウントします。の"...DONE!"最後のカウンター、9と同じ行に印刷されます。

OPの場合、これによりコンソールはインストールの完了率を「進行状況バー」として表示し、開始と終了の文字位置を定義し、その間のマーカーを更新できます。

print("Installing |XXXXXX              | 30%"),

4

@ Vadim-Zin4ukによって3.0バージョンから派生した2.7互換バージョンを次に示します。

Python 2

import time

for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    print '{0}\r'.format(s),                # just print and flush

    time.sleep(0.2)

さらに言えば、提供されている3.0ソリューションは少し肥大化しています。たとえば、backspaceメソッドは整数引数を使用しないため、おそらく完全に取り除くことができます。

Python 3

import time

for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    print('{0}\r'.format(s), end='')        # just print and flush

    time.sleep(0.2)                         # sleep for 200ms

どちらもテスト済みで動作しています。


2

これは非常に古いスレッドですが、これは非常に完全な回答とサンプルコードです。

\rASCII文字セットからの復帰の文字列表現です。これは、進と同じだ015[ chr(0o15)]または16進0d[ chr(0x0d)]または小数13[ chr(13)]。man ascii退屈な読み取りについては、を参照してください。それ(\r)はかなりポータブルな表現であり、人々が読むのに十分簡単です。それは非常に単純に、紙を進めずにタイプライターのキャリッジを最初から最後まで動かすことを意味します。これは、キャリッジリターンとラインフィードを意味するCR部分です。CRLF

print()はPython 3の関数です。Python2(使用したい任意のバージョン)ではprint__future__モジュールからその定義をインポートすることで、関数に強制できます。このprint関数の利点は、最後に何を印刷するかを指定できること\nで、すべてのprint()呼び出しの最後に改行を印刷するというデフォルトの動作を上書きできます。

sys.stdout.flush標準出力の出力をフラッシュするようにPythonに指示します。標準出力はprint()特に指定しない限り、ここで出力を送信します。python -u環境変数を使用して実行したりPYTHONUNBUFFERED=1、環境変数を設定したりして、import sysとのsys.stdout.flush()呼び出しをスキップしても、同じ動作を得ることができます。これを行うことで得られる量はほぼ正確にゼロであり、アプリケーションが正しく動作する前にそのステップを実行する必要があることを忘れてしまうと、デバッグが非常に難しくなります。

そしてサンプル。これはPython 2または3で完全に実行されることに注意してください。

from __future__ import print_function

import sys
import time

ANS = 42
FACTORS = {n for n in range(1, ANS + 1) if ANS % n == 0}

for i in range(1, ANS + 1):
    if i in FACTORS:
        print('\r{0:d}'.format(i), end='')
        sys.stdout.flush()
        time.sleep(ANS / 100.0)
else:
    print()

私はあなたの答えは、より適していると思う:stackoverflow.com/questions/45263205/...
マルク・Cayuela Rafols

2

print()には組み込みパラメータ「end」があり、デフォルトでは「\ n」に設定されています。print( "This is America")の呼び出しは、実際にはprint( "This is America"、end = "\ n")を呼び出しています。簡単な方法は、print( "This is America"、end = "")を呼び出すことです


1

値を配列に事前に保存している場合に備えて、次の形式で呼び出すことができます。

for i in range(0,n):
       print arr[i],

1

Pythonは、印刷の終わりとして改行を追加します。改行ではなくスペースを追加するには、printメソッドのpython3にend = ''を使用します。python2の場合、printステートメントの最後にコンマを使用します。

print("Foo",end=' ')
print('Bar')

0

このQuoraの投稿を見つけました。この例は私(python 3)で機能し、私が必要とするものに近づきました(つまり、前の行全体を消去しました)。

彼らが提供する例:

def clock():
   while True:
       print(datetime.now().strftime("%H:%M:%S"), end="\r")

同じ行に印刷するには、他の人が示唆しているように、 end=""


-2

私はこの解決策を見つけました、そしてそれはPython 2.7で動作しています

# Working on Python 2.7 Linux

import time
import sys


def backspace(n):
    print('\r', end='')                     # use '\r' to go back


for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    sys.stdout.write(string)
    backspace(len(s))                       # back for n chars
    sys.stdout.flush()
    time.sleep(0.2)                         # sleep for 200ms

1
これprintはPython 2.7の不正な構文であり、コードは正しい構文でも機能しません。
Cory Madden
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.