web-dev-qa-db-ja.com

改行やスペースを入れずに印刷するにはどうすればいいですか?

質問はタイトルにあります。

python でやりたいのですが。この例で c にしたいことは次のとおりです。

#include <stdio.h>

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

出力:

..........

Pythonでは:

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

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

1623
Andrea Ambu

一般的な方法

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

また電話する必要があるかもしれません

sys.stdout.flush()

stdoutが直ちにフラッシュされるようにします。

Python 2.6以降

Python 2.6から、Python 3からprint関数をインポートすることができます。

from __future__ import print_function

これにより、以下のPython 3ソリューションを使用することができます。

Python 3

Python 3では、printステートメントは関数に変更されました。 Python 3では、代わりに次のことができます。

print('.', end='')

from __future__ import print_functionを使ったことがあれば、これはPython 2でも動きます。

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

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

ただし、Python 2の__future__からインポートされたバージョンのflush関数では、printキーワードは使用できません。 Python 3、より具体的には3.3以降でのみ動作します。以前のバージョンではまだsys.stdout.flush()の呼び出しで手動でフラッシュする必要があります。

出典

  1. https://docs.python.org/2/library/functions.html#print
  2. https://docs.python.org/2/library/__future__.html
  3. https://docs.python.org/3/library/functions.html#print
2236
codelogic

Guido Van Rossumによるこのリンクで説明されているのと同じくらい簡単なはずです。

再:どのように1つのC/Rなしで印刷するのですか?

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

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

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

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

注:この質問のタイトルは、「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
..........
162
Beau

Python2.6にはpython3スタイルのprint関数を使用してください。+ (同じファイル内の既存のキーワード付きprintステートメントも破壊されます)

# 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
90
k107

これはタイトルの質問に対する答えではありませんが、同じ行に印刷する方法に関する答えです。

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

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

26
SilentGhost

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

>>> import functools

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

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

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

18
sohail288

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

17
user3763437

pythonのprint関数は自動的に新しい行を生成します。あなたが試すことができます:

print("Hello World", end="")

15
klee8_

endprint引数でそれを行うことができます。 Python3では、range()はイテレータを返し、xrange()は存在しません。

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

Python 3.6.1のコード

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

出力

..........
>>>
11
Jasmohan

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

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

Python 3では、印刷は関数です。電話するとき

print ('hello world')

Pythonはそれをに翻訳します

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

あなたはあなたが望むものにendを変えることができます。

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

私は最近同じ問題を抱えていました。

私はそれをやって解決しました:

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

6
ssgam

あなたは上記のすべての答えが正しいことに気づくでしょう。しかし、最後に常に "end = ''"パラメータを書くことへの近道を作りたいと思いました。

あなたは次のように関数を定義することができます

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

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

5
Bikram Kumar

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') `
5
n611x007

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

#!usr/bin/python

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

python filename.pyまたはpython3 filename.pyを付けて実行します。

5
Subbu
for i in xrange(0,10): print '.',

これはあなたのために働くでしょう。ここでは、カンマ(、)は印刷後に重要です。から助けを得ました: http://freecodeszone.blogspot.in/2016/11/how-to-print-in-python-without-newline.html

4
Shekhar

これらの答えの多くは少し複雑に思えます。 Python 3.Xでは、単にこれを行います。

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

Endのデフォルト値は "\ n"です。単純にスペースに変更するか、end = ""を使用することもできます。

4
jarr

@lenoohは私の質問に答えました。 「python suppress newline」を検索している間にこの記事を発見しました。私はRaspberry PiでIDLE3を使用して、PuTTY用のPython 3.2を開発しています。 PuTTYコマンドラインにプログレスバーを作成したいと思いました。ページをスクロールしたくない。私は、プログラムが陽気な無限ループで打ち切られたり昼食に送られたりしていないことを、ユーザーに気付かせないようにするための水平線を求めていました。しかし、これにはしばらく時間がかかります。インタラクティブメッセージ - テキストのプログレスバーのようなものです。

print('Skimming for', search_string, '\b! .001', end='')は次のスクリーンライトの準備をすることでメッセージを初期化します。これは3つのバックスペースとそれに続く1つのピリオドを印刷し、 '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'))行にあります。まず、左に消去するには、 '\ b\b\b'を⌫⌫⌫消しゴムとして3つの数字の上にカーソルを置き、プログレスバーの長さに追加する新しいピリオドを削除します。それからそれはそれが今まで進行したページの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> wiz

4
DisneyWizard

あなたはfor loop rightで何かを印刷したいのですが、毎回新しい行に印刷したくはありません。

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

 OUTPUT:
    hi
    hi
    hi
    hi
    hi

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

例:

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

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

これは2.7.8と2.5.2(それぞれCanopyとOSXターミナル)で動作しました - モジュールのインポートやタイムトラベルは不要です。

2
tyersome

またはのような機能を持っています:

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

それでは今:

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

出力:

0123456789
2
U9-Forward

これは改行を挿入せずに印刷する一般的な方法です。

Python 3

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

Python 3では、実装はとても簡単です。

1