回答:
に変更print item
:
print item,
Python 2.7print(item, end=" ")
Python 3データを動的に印刷する場合は、次の構文を使用します。
print(item, sep=' ', end='', flush=True)
Python 3'\n'
ない限り、文字は最後に書かれprint
ます。これは、ステートメントにキーワードのみが含まれている場合の唯一のアクションですprint
。
flush
では動作しませんfrom __future__ import print_function
、残念ながら。
print(item, end=", ")
それを、その後も追加,
追加してからそれを防ぐ方法を行うために、最後の項目に,
最後の項目に
ちなみに……毎回リフレッシュして一箇所にmiを印刷する方法は数字を変えるだけ。
一般に、その方法は端末制御コードを使用することです。これは、'\r'
Python(および他の多くの言語)で記述された1つの特殊文字U + 000D CARRIAGE RETURNだけが必要な、特に単純なケースです。ここにあなたのコードに基づく完全な例があります:
from sys import stdout
from time import sleep
for i in range(1,20):
stdout.write("\r%d" % i)
stdout.flush()
sleep(1)
stdout.write("\n") # move the cursor to the next line
これについては驚くべきことがいくつかあります。
\r
カーソルは常に番号の後になりますので、プログラムの実行中に、という文字列の先頭になります。これは単なる表面的なものではありません。一部のターミナルエミュレータは、逆に使用すると非常に混乱します。stdout.flush
一部のシステムではこれが必要です。そうしないと、出力が得られません。他のシステムでは必要ないかもしれませんが、害はありません。これが機能しない場合は、最初に疑うべきことは、ターミナルエミュレータにバグがあることです。vttestプログラムは、あなたがそれをテストすることができます。
あなたは置き換えることができstdout.write
てprint
声明が、私はミックスしたくないprint
ファイルオブジェクトを直接使用して。
flush()
現在のファイルをオペレーティングシステムに送信します。それがなくても機能することに驚いています。追加するまで機能しませんでした。
ncurses
してカーソルを非表示にすることを強くお勧めします。
sys.stdout.flush()
私のmendatoryのようだFreebsd
とPython 2.7
print item,
印刷ステートメントで改行を省略するために使用します。
Python 3ではprint(item, end=" ")
です。
すべての数値を同じ場所に表示する場合は、たとえば(Python 2.7)を使用します。
to = 20
digits = len(str(to - 1))
delete = "\b" * (digits + 1)
for i in range(to):
print "{0}{1:{2}}".format(delete, i, digits),
Python 3では、少し複雑です。ここでは、フラッシュする必要があります。そうしないとsys.stdout
、ループが終了するまで何も出力されません。
import sys
to = 20
digits = len(str(to - 1))
delete = "\b" * (digits)
for i in range(to):
print("{0}{1:{2}}".format(delete, i, digits), end="")
sys.stdout.flush()
他の例と同様に、
私は同様のアプローチを使用しますが、最後の出力長などを計算するために時間を費やすのではなく、
ANSIコードエスケープを使用して行の先頭に戻り、現在のステータス出力を出力する前にその行全体をクリアします。
import sys
class Printer():
"""Print things to stdout on one line dynamically"""
def __init__(self,data):
sys.stdout.write("\r\x1b[K"+data.__str__())
sys.stdout.flush()
反復ループで使用するには、次のように呼び出します。
x = 1
for f in fileList:
ProcessFile(f)
output = "File number %d completed." % x
Printer(output)
x += 1
各反復で改行の代わりにスペースを印刷するために、末尾のコンマを印刷ステートメントに追加できます。
print item,
または、Python 2.6以降を使用している場合は、新しい印刷関数を使用できます。これにより、印刷される各項目の末尾にスペースすらもないように指定できます(または、任意の末尾を指定できます)欲しいです):
from __future__ import print_function
...
print(item, end="")
最後に、ファイルのようなオブジェクトを返すsysモジュールからインポートすることにより、標準出力に直接書き込むことができます。
from sys import stdout
...
stdout.write( str(item) )
変化する
print item
に
print "\033[K", item, "\r",
sys.stdout.flush()
\033[K
コードについて学んだ場所への参照を提供できますか?それらについてもっと知りたいのですが。
print
既に内部的にフラッシュしています。呼び出す必要はありません。画面にフラッシュする必要がある場所とprint
は異なりsys.stdout.write()
ます
単純な結合でうまくいくと思います:
nl = []
for x in range(1,10):nl.append(str(x))
print ' '.join(nl)
print ' '.join(str(x) for x in range(1, 10))
。
「。」を出力する2.7で使用している別の答え。ループが実行されるたびに(物事がまだ実行中であることをユーザーに示すため)、次のようになります。
print "\b.",
「。」を出力します。それぞれの間にスペースのない文字。それは少し良く見え、かなりうまくいきます。\ bは不思議に思う人のためのバックスペース文字です。
非常に多くの複雑な答え。python 3を使用している場合は、単に\r
印刷の先頭に置いて、end='', flush=True
それに追加します。
import time
for i in range(10):
print(f'\r{i} foo bar', end='', flush=True)
time.sleep(0.5)
これにより、が書き込まれ0 foo bar
、その後1 foo bar
、同様に書き込まれます。
print('\r' + filename + " ", end = '', flush=True)
数値を互いに上書きするには、次のようにします。
for i in range(1,100):
print "\r",i,
番号が最初の列に出力されている限り、これは機能するはずです。
編集:最初の列に印刷されていない場合でも機能するバージョンを次に示します。
prev_digits = -1
for i in range(0,1000):
print("%s%d" % ("\b"*(prev_digits + 1), i)),
prev_digits = len(str(i))
このコードはテスト済みで、WindowsコンソールのWindows上のPython 2.5で問題なく機能することに注意してください。他の人によると、結果を表示するにはstdoutのフラッシュが必要になる場合があります。YMMV。
「ちなみに……一箇所でmiを印刷するように毎回更新する方法は数を変えるだけ。」
それは本当にトリッキーなトピックです。何ザック(コンソール制御コードを出力)を示唆してそれを達成する一つの方法です。
(n)cursesを使用できますが、これは主に* nixesで機能します。
Windows(およびここで興味深い部分)ではめったに言及されませんが(理由は理解できません)、WinAPIへのPythonバインディングを使用できます(デフォルトではActivePythonでもhttp://sourceforge.net/projects/pywin32/を使用できます)。そのハードとうまく動作します。ここに小さな例があります:
import win32console, time
output_handle = win32console.GetStdHandle( win32console.STD_OUTPUT_HANDLE )
info = output_handle.GetConsoleScreenBufferInfo()
pos = info["CursorPosition"]
for i in "\\|/-\\|/-":
output_handle.WriteConsoleOutputCharacter( i, pos )
time.sleep( 1 )
または、使用したい場合print
(ステートメントまたは関数、違いなし):
import win32console, time
output_handle = win32console.GetStdHandle( win32console.STD_OUTPUT_HANDLE )
info = output_handle.GetConsoleScreenBufferInfo()
pos = info["CursorPosition"]
for i in "\\|/-\\|/-":
print i
output_handle.SetConsoleCursorPosition( pos )
time.sleep( 1 )
win32console
モジュールを使用すると、Windowsコンソールでさらに多くの興味深いことを実行できます...私はWinAPIの大ファンではありませんが、最近の反感の少なくとも半分はCでのWinAPIコードの記述が原因であることに気付きました-Pythonバインディングははるかに使いやすい。
もちろん、他のすべての答えは素晴らしく、pythonicですが、... 前の行に印刷したい場合はどうなりますか?または、複数行のテキストを書いて、それをクリアして同じ行をもう一度書くのですか?私のソリューションはそれを可能にします。
Python 2.7
for x in range(0, 3):
print x,
Python 3
for x in range(0, 3):
print(x, end=" ")
In [9]: print?
Type: builtin_function_or_method
Base Class: <type 'builtin_function_or_method'>
String Form: <built-in function print>
Namespace: Python builtin
Docstring:
print(value, ..., sep=' ', end='\n', file=sys.stdout)
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
数値を出力するだけの場合は、ループを回避できます。
# python 3
import time
startnumber = 1
endnumber = 100
# solution A without a for loop
start_time = time.clock()
m = map(str, range(startnumber, endnumber + 1))
print(' '.join(m))
end_time = time.clock()
timetaken = (end_time - start_time) * 1000
print('took {0}ms\n'.format(timetaken))
# solution B: with a for loop
start_time = time.clock()
for i in range(startnumber, endnumber + 1):
print(i, end=' ')
end_time = time.clock()
timetaken = (end_time - start_time) * 1000
print('\ntook {0}ms\n'.format(timetaken))
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 21.1986929975msかかりました
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 491.466823551ミリ秒かかりました
map
。
Python 3では、次のように実行できます。
for item in range(1,10):
print(item, end =" ")
出力:
1 2 3 4 5 6 7 8 9
タプル:タプルでも同じことができます:
tup = (1,2,3,4,5)
for n in tup:
print(n, end = " - ")
出力:
1 - 2 - 3 - 4 - 5 -
もう一つの例:
list_of_tuples = [(1,2),('A','B'), (3,4), ('Cat', 'Dog')]
for item in list_of_tuples:
print(item)
出力:
(1, 2)
('A', 'B')
(3, 4)
('Cat', 'Dog')
次のようにタプルをアンパックすることもできます。
list_of_tuples = [(1,2),('A','B'), (3,4), ('Cat', 'Dog')]
# Tuple unpacking so that you can deal with elements inside of the tuple individually
for (item1, item2) in list_of_tuples:
print(item1, item2)
出力:
1 2
A B
3 4
Cat Dog
別のバリエーション:
list_of_tuples = [(1,2),('A','B'), (3,4), ('Cat', 'Dog')]
for (item1, item2) in list_of_tuples:
print(item1)
print(item2)
print('\n')
出力:
1
2
A
B
3
4
Cat
Dog
私のように苦労している人のために、私はpython 3.7.4と3.5.2の両方で動作するように見える次のことを思いつきました。
実行速度が非常に速く、出力が表示されない可能性があるため、100から1,000,000に範囲を拡大しました。これは、設定の副作用の1つend='\r'
として、最後のループの反復によりすべての出力がクリアされるためです。それが機能することを示すには、より長い数が必要でした。この結果はすべての場合に望ましいわけではありませんが、私の場合は問題がなく、OPは何らかの方法を指定していませんでした。反復される配列の長さを評価するifステートメントなどでこれを回避できる可能性があります。私の場合、これを機能させるための鍵は、角かっこを"{}"
と結合することでした.format()
。それ以外の場合は、機能しませんでした。
以下はそのまま動作します:
#!/usr/bin/env python3
for item in range(1,1000000):
print("{}".format(item), end='\r', flush=True)
for item in range(1,100):
if item==99:
print(item,end='')
else:
print (item,end=',')
出力:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24、 25、26、27、28、29、30、31、32、33、34、35、36、37、38、39、40、41、42、43、44、45、46、47、48、49、 50、51、52、53、54、55、56、57、58、59、60、61、62、63、64、65、66、67、68、69、70、71、72、73、74、 75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99
またはさらに簡単:
import time
a = 0
while True:
print (a, end="\r")
a += 1
time.sleep(0.1)
end="\r"
最初の印刷の最初[0:]から上書きします。