web-dev-qa-db-ja.com

Python:同じ行に複数の印刷

スクリプトを実行したいのですが、基本的には次のようなことがわかります。

Installing XXX...               [DONE]

さて、現時点では、関数が成功した後にprintを使って行全体を印刷します。しかし、ここで最初に "Installing xxx ..."を印刷し、関数の実行後に "DONE"タグを追加するようにします。しかし同じ行に。

何か案は?

196
user697108

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関数はデフォルトで"\n"になるendパラメータを受け取ります。空の文字列に設定すると、行末に新しい行が発行されなくなります。

250

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

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

出力は次のようになります。

something else

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

Python 3 +最後の改行を削除するprint("some string", end="");。もっと読むhelp(print);

101
boldnik

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

43
ferostar

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

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ループで異なる動作をするのはなぜですか?

43
Vadim Zin4uk

新しい行に遭遇するまでそれらがすべて一時停止したので、答えのどれも私のために働きませんでした。私は簡単なヘルパーを書きました:

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')

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

16
incognick

sys.stdout.writeは改行なしで印刷されます

import sys
sys.stdout.write("installing xxx")
sys.stdout.write(".")

http://en.wikibooks.org/wiki/Python_Programming/Input_and_output#printing_without_commas_or_newlines

14
John Giotta

この簡単な例では、同じ行に1から10を印刷します。

for i in range(1,11):
    print (i, end=" ")
8
Umali Leonard

Printはオプションのend引数を持ち、それが最後に出力されたものです。デフォルトは改行ですが、空文字列に変更することができます。例:print( "hello world!"、end = "")

7
TulkinRB

最も単純な

Python 3

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

これは、何かを印刷して同じ行で終わるよりも、カーソルを先頭に戻すことを意味します。ループしている場合は、同じ場所で印刷を開始します。

6
Octavius

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

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
Brian Bunker

ここでは、@ 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解決策は少し肥大しているように見えます。たとえば、バックスペースメソッドは整数引数を使用しないため、おそらく完全になくすことができます。

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

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

3
Dannid

これは非常に古いスレッドですが、これは非常に徹底的な答えとサンプルコードです。

\rは、ASCII文字セットからのキャリッジリターンの文字列表現です。 8進数の015 [chr(0o15)]、16進数の0d [chr(0x0d)]、または10進数の13 [chr(13)]と同じです。退屈な読み取りについてはman asciiを参照してください。それ(\r)はかなり移植性のある表現であり、人々が読むのに十分なほど簡単です。それは非常に単純に、紙を進めずにタイプライターのキャリッジを最初の位置に戻すことを意味します。これはCRCRLF部分であり、これは改行と改行を意味します。

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()
2
Chris Cosby

念のため、配列に値をあらかじめ保存している場合は、次の形式でそれらを呼び出すことができます。

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

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

1
Miles Mbo