Yeni satır veya boşluk olmadan nasıl yazdırılır?


1872

Bunu yapmak istiyorum . Bu örnekte ne yapmak istiyorum:

C dilinde:

#include <stdio.h>

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

Çıktı:

..........

Python'da:

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

Python printa \nveya boşluk ekleyecek , bunu nasıl önleyebilirim? Şimdi, bu sadece bir örnek, önce bir dize yapıp sonra yazdırabileceğimi söyleme. Dizeleri nasıl "ekleyeceğinizi" bilmek istiyorum stdout.



1
Benzer bir soru daha önce sorulmuş gibi görünüyor: https://stackoverflow.com/q/255147/9325817
Vignesh Bayari R.

Yanıtlar:


2535

Python 3'te, işlevin sep=ve end=parametrelerini kullanabilirsiniz print:

Dizenin sonuna yeni satır eklememek için:

print('.', end='')

Yazdırmak istediğiniz tüm işlev bağımsız değişkenleri arasına boşluk eklememek için:

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

Herhangi bir dizeyi herhangi bir parametreye iletebilir ve her iki parametreyi aynı anda kullanabilirsiniz.

Arabelleğe alma ile ilgili sorun yaşıyorsanız, flush=Trueanahtar kelime bağımsız değişkeni ekleyerek çıktıyı temizleyebilirsiniz :

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

Python 2.6 ve 2.7

Python 2.6'dan print, __future__modülü kullanarak Python 3'ten işlevi içe aktarabilirsiniz :

from __future__ import print_function

Bu da yukarıdaki Python 3 çözümünü kullanmanızı sağlar.

Ancak, flushanahtar kelimenin Python 2'den printiçe aktarılan işlev sürümünde mevcut olmadığını unutmayın __future__; sadece Python 3'te, daha spesifik olarak 3.3 ve sonrasında çalışır. Önceki sürümlerde hala bir çağrıyla manuel olarak yıkamanız gerekir sys.stdout.flush(). Ayrıca, bu içe aktarmayı yaptığınız dosyadaki diğer tüm yazdırma ifadelerini yeniden yazmanız gerekir.

Veya kullanabilirsiniz sys.stdout.write()

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

Ayrıca aramanız gerekebilir

sys.stdout.flush()

emin olmak stdoutiçin hemen yıkayın.


2
Teşekkürler! Python 3.6.3'te, o flush = True çok önemlidir, aksi takdirde amaçlandığı gibi çalışmaz.
gunit

3
Birisi neden ihtiyacım olduğunu flushve aslında ne yaptığını açıklayabilir mi?
Rishav

5
Birkaç ay gecikti, ancak @Rishav sifonunu cevaplamak arabelleği boşaltır ve çıktıyı şu anda görüntüler. Floş olmadan tam metninizi sonunda yazdırabilirsiniz, ancak yalnızca sistem IO yerine grafikleri işlemeye başladığında. Yıkama, önbelleği "temizleyerek" metni hemen görünür hale getirir.
Büyük Kaplumbağa

297

Bu bağlantıda Guido Van Rossum tarafından tarif edilen kadar basit olmalıdır:

Re: ac / r olmadan nasıl baskı?

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

Bir şey yazdırmak mümkün mü, ancak otomatik olarak bir satır başı eklenmemiş mi?

Evet, yazdırılacak son argümandan sonra virgül ekleyin. Örneğin, bu döngü 0..9 sayılarını boşluklarla ayrılmış bir satıra yazdırır. Son satırsonu ekleyen parametresiz "yazdır" a dikkat edin:

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

99
Bu, özellikle boşluklar nedeniyle soruda istenmeyen davranış olarak listelenmiştir
Zags

87
Aksine, cevap iki nedenden dolayı silinmelidir: devre dışı bırakamayacağınız istenmeyen yan etkileri vardır (ekstra boşluklar dahil) ve python 3 ile ileriye uyumlu değildir (parantez bir tuple dönüşümüne zorlar) . Ben bu tür çapkın yapılar PHP, Python değil bekliyoruz. Bu yüzden bunu hiç kullanmamak en iyisidir.
Eric Leschinski

9
//, Python 2'de bunu yapmanın en basit yolu ve gerçekten eski işletim sistemleri için bir kerelik bir kod var. Muhtemelen en iyi çözüm değil, hatta tavsiye edilir. Bununla birlikte, StackOverflow'un en büyük avantajlarından biri, orada garip hilelerin neler olduğunu bize bildirmesidir. KDP, @Eric Leschinski'nin söyledikleri hakkında en üste hızlı bir uyarı ekler misiniz? Ne de olsa mantıklı.
Nathan Basanese

23
@nathanbasanese Basit ya da değil, askerin açıkça istemediği bir yan etkisi vardır . Downvoted.
Shadur

8
Özellikle soruyu cevaplamayan bir cevap için 270 oy . İyi iş milletvekili. İyi iş.
Silindirik

168

Not: Bu sorunun başlığı eskiden "Python'da nasıl yazdırılır?"

İnsanlar buraya başlığa göre aramaya gelebileceklerinden, Python printf tarzı ikameyi de destekliyor:

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

Ve, dize değerlerini el ile çarpabilirsiniz:

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

10
Gerçekten de bu noktayı kaçırıyor. :) Soruna zaten büyük bir cevap olduğu için, yararlı olabilecek bazı ilgili teknikler üzerinde duruyordum.
Beau

8
Sorunun başlığına dayanarak, bu cevabın C / C ++ 'da yaygın olarak printf'i nasıl kullandığına daha uygun bir analog olduğuna inanıyorum
Dan

16
Bu, sorunun başlığını cevaplar, ancak beden değil. Dedi ki, bana aradığım şeyi sağladı. :)
ayman

2
sorunun cevabı değil
Vanuan

4
@Vanuan, cevabımın alt kısmında sorunun başlığının bir noktada değiştiğini açıkladım. :)
Beau

93

Python2.6 + için python3 tarzı yazdırma işlevini kullanın (aynı dosyadaki anahtar kelime var olan tüm yazdırma ifadelerini de kırar.)

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

Tüm python2 yazdırma anahtar kelimelerinizi bozmamak için ayrı bir printf.pydosya oluşturun

# printf.py

from __future__ import print_function

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

Ardından, dosyanızda kullanın

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

Printf stilini gösteren diğer örnekler

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

39

Aynı satıra nasıl yazdırılır:

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

27

Yeni (Python 3.x'ten itibaren) printişlevi, endbitiş karakterini değiştirmenizi sağlayan isteğe bağlı bir parametreye sahiptir:

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

Çıktı:

MERHABA MERHABA

sepAyırıcı için de var :

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

Çıktı:

MERHABA MERHABA MERHABA

Python 2.x bu kullanmak istiyorsa sadece bu eklemek başından dosyanızın:

from __future__ import print_function


1
"sep" ne yapar?
McPeppr

1
@McPeppr Bunun eski olduğunu biliyorum ama yine de cevabı daha fazla netlik için düzenledim. Şimdi kontrol et.
TheTechRobo36414519

Düzenleme için teşekkürler. ey kullanışlı olacaktır. Şimdiye kadar bir ayırıcı ile bir listenin öğelerini birleştirmek için sep.join (list) kullandım - csv dosyaları yazmak için mükemmel
McPeppr

21

Printf adlı yeni bir işlev oluşturmak için functools.partial kullanma

>>> import functools

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

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

Bir işlevi varsayılan parametrelerle sarmanın kolay yolu.


16

Yeni satıra yazdırmamak için işlevin ,sonuna ekleyebilirsiniz print.


1
//, Bu aslında hiçbir şey yazdırdı yaptı. Daha sonra stackoverflow.com/a/493500/2146138'de gösterildiği gibi, sonunda argüman olmadan başka bir yazdırma ifadesi eklememiz gerekmez mi? Bu cevabı gerçekten kısa iki ya da üç satırlı bir örnekle düzenlemek ister misiniz?
Nathan Basanese

3
OP
eklenmiyor

2
Soruya cevap vermedi. Boşluksuz.
shrewmouse

Bu artık Python 2.x'te çalışmaz ve OP'nin istediklerinin sadece yarısını yanıtlar. Neden 16 upvotes?
TheTechRobo36414519

12

Python 3 + ' printda bir işlevdir. Aradığın zaman

print('hello world')

Python onu

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

Ne istersen değiştirebilirsin 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('.')

her baskıdan sonra fazladan boşluk varsa, python 2'de

print '.',

Python 2'de yanıltıcı - kaçının :

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

Deneyebilirsin:

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

Aynı şeyi python3'te aşağıdaki gibi yapabilirsiniz:

#!usr/bin/python

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

ve python filename.pyveya ile yürütünpython3 filename.py


5

Geçenlerde aynı sorunu yaşadım ..

yaparak çözdüm:

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)

bu hem unix hem de pencerelerde çalışıyor ... macosx üzerinde test etmedi ...

hth


2
Tatillersys.__stdout__
pppery

4

@lenooh sorgumu tatmin etti. 'Python supress newline'ı ararken bu makaleyi keşfettim. PuTTY için Python 3.2 geliştirmek için Raspberry Pi üzerinde IDLE3 kullanıyorum. PuTTY komut satırında bir ilerleme çubuğu oluşturmak istedim. Sayfanın kaymasını istemiyordum. Kullanıcının, programın durma noktasına gelmediğini veya neşeli sonsuz bir döngüde öğle yemeğine gönderilmediğini korkutmasını sağlamak için yatay bir çizgi istedim - beni 'bırakma, iyi yapıyorum' ama bu biraz zaman alabilir. ' etkileşimli mesaj - metindeki ilerleme çubuğu gibi.

İlk print('Skimming for', search_string, '\b! .001', end='')harfi üç boşluk ve ardından nokta olarak yazdırarak, '001' i silerek ve nokta çizgisini uzatan bir sonraki ekran yazma için hazırlayarak mesajı başlatır. search_stringKullanıcı girdisini papağan ettikten sonra , \b!metnimin ünlem noktasını, aksi takdirde noktalama işaretlerini düzgün bir şekilde yerleştirerek, zorlayan search_stringalana geri print()keser. Bunu bir boşluk ve simüle ettiğim 'ilerleme çubuğunun' ilk 'noktası' izler. Gereksiz olarak, ileti, kullanıcıdan ilerlemenin işlendiğini ve daha sonra oluşturacağımız dönem sayısını da yansıtacak şekilde uyarmak için sayfa numarasıyla (baştaki sıfırlarla üç uzunlukta biçimlendirilmiş) hazırlanır. sağ.

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

İlerleme çubuğu eti sırada sys.stdout.write('\b\b\b.'+format(page, '03')). İlk olarak, sola silmek için imleci üç sayısal karakterin üzerine 'ruble olarak' \ b \ b \ b 'ile yedekler ve ilerleme çubuğu uzunluğuna eklemek için yeni bir süre bırakır. Ardından, o ana kadar ilerlediği sayfanın üç basamağını yazar. Çünkü sys.stdout.write()tam tampon ya da çıkış kanalı için bekler, kapatma sys.stdout.flush()kuvvetleri hemen yazma. sys.stdout.flush()sonu print()ile atlanır inşa edilir print(txt, end='' ). Daha sonra kod, sıralı zaman yoğun işlemlerinden geçerken, üç basamağı silmek, bir nokta eklemek ve tekrar üç basamak yazmak için buraya geri dönene kadar başka bir şey basmaz.

Sildi ve yeniden yazılabilir üç basamaklı gerekli hiçbir şekilde - bu örnek bir model sadece güzelleşmek var sys.stdout.write()karşı print(). Bir nokta ile kolayca hazırlanabilir ve üç süslü ters eğik çizgi-b ⌫ arka alanını unutabilirsiniz (elbette biçimlendirilmiş sayfa sayıları da yazmazsınız). sys.stdout.write('.'); sys.stdout.flush()çift.

Raspberry Pi IDLE3 Python kabuğunun arka boşluğu ⌫ rubout olarak onurlandırmadığını, bunun yerine bir boşluk yazdırdığını ve bunun yerine görünür bir kesir listesi oluşturduğunu unutmayın.

- (o = 8> wiz


4

Yukarıdaki tüm cevapların doğru olduğunu göreceksiniz. Ama sonunda daima "end = ''" parametresini yazmak için bir kısayol yapmak istedim.

Gibi bir işlev tanımlayabilirsiniz

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

Tüm parametre sayısını kabul eder. Hatta dosya, floş, vb.Gibi diğer tüm parametreleri ve aynı adla kabul edecektir.


*argÇalışmaz, başlangıçta olan şikayetler (python 2.7) ve sonunda koymak koştu, ama tamamen doğru çalışmadı. Sadece alan bir işlev tanımladım Print(*args)ve sonra print ile çağırdım sep='', end=''. Ve şimdi istediğim gibi çalışıyor. Fikir için bir oy.
Otzen

4

Bu cevapların çoğu biraz karmaşık görünüyor. Python 3.x'te bunu yapmanız yeterlidir:

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

Varsayılan end değeri "\n". Basitçe bir boşluğa değiştiriyoruz veya normalde end=""ne yapmak için de (boşluk yok) kullanabilirsiniz printf.


3

döngü için bir şey yazdırmak istiyorsunuz, ancak her seferinde yeni bir satıra yazdırmasını istemiyorsunuz .. örneğin:

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

 OUTPUT:
    hi
    hi
    hi
    hi
    hi

ama böyle yazdırmak istiyorsunuz: hi hi hi hi hi hi doğru ???? "hi" yazdıktan sonra virgül ekleyin

Misal:

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


5
Hayır, OP hihihihihi istiyor, değil hi hi hi hi hi
Cool Javelin

1

Veya aşağıdaki gibi bir işleve sahip olun:

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

Öyleyse şimdi:

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

Çıktılar:

0123456789

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

Bu hem 2.7.8 hem de 2.5.2'de çalıştı (sırasıyla Canopy ve OSX terminali) - modül ithalatı veya zaman yolculuğu gerekmez.


8
Geri silme karakterlerini standart çıktıya yazdırır. Bu olabilir bakmak standart çıktı bir terminal olmak olur, doğru, ama bir dosyaya yönlendirilir eğer dosya denetim karakterleri içerecek.
Keith Thompson

1
Doğru, ama kimsenin bunu düşük teknolojili bir ilerleme çubuğundan başka bir şey için kullanmak isteyeceğini hayal edemiyorum ...
tyersome

1
Bununla birlikte, Python kodu sorudaki C koduyla aynı şeyi yapmaz.
Keith Thompson

sys.stdout.isatty()bir dosyaya yönlendirilmezse test edebilirsiniz .
fcm

0

Bunu yapmanın genel iki yolu vardır:

Python 3.x'te satırsonu olmadan yazdırma

Print ifadesinden sonra hiçbir şey eklemeyin ve '\ n' öğesini şu şekilde kullanarak kaldırın end='' :

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

Döngüde Bir Örnek :

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

Python 2.x'te satırsonu olmadan yazdırma

Sonunda virgül eklemek baskıdan sonra yoksay \n.

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

Döngüde Bir Örnek :

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

Umarım bu size yardımcı olacaktır. Bu bağlantıyı ziyaret edebilirsiniz .


Alan ne olacak?
shrewmouse

end=" "örneğin kullanın : print ('merhaba', end = '' "); print ('dünya')
susan097

2.7 çözümünüz alanı kaldırmaz.
shrewmouse

'\ N' alan değil, boşluk varsayılan olarak python2'de belirtilmiştir. Bkz bu ne görünüyor: print 'hello' ;print'there'in paiza.io/projects/e/35So9iUPfMdIORGzJTb2NQ
susan097

Evet, bu yüzden cevabınız aşağı oylandı. "Yeni satır veya boşluk olmadan nasıl yazdırılır?" Sorusuna cevap vermediniz. 2.x için yanıtınız soruyu cevaplamıyor. 3.0 için verdiğiniz yanıt, dokuz yıl önce gönderilen diğer yanıtların çoğu ile aynıdır. Basitçe ifade etmek gerekirse, bu cevap topluluğa faydalı bir şey eklemez ve silmeniz gerekir.
shrewmouse

-3

... herhangi bir kitaplığı içe aktarmanıza gerek yoktur. Silme karakterini kullanmanız yeterlidir:

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

bu yeni satırı ve boşluğu (^ _ ^) kaldırır *

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.