Bagaimana cara mencetak tanpa baris baru atau spasi?


1872

Saya ingin melakukannya . Apa yang ingin saya lakukan dalam contoh ini di:

Dalam C:

#include <stdio.h>

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

Keluaran:

..........

Dengan Python:

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

Dalam Python printakan menambah \natau spasi, bagaimana saya bisa menghindarinya? Sekarang, ini hanya sebuah contoh, jangan bilang saya pertama-tama bisa membuat string kemudian mencetaknya. Saya ingin tahu cara "menambahkan" string stdout.


8
Bagi mereka yang mencari string yang membentuk dokumentasi python: docs.python.org/library/stdtypes.html#string-formatting
guettli

1
Sepertinya pertanyaan serupa telah ditanyakan sebelumnya: https://stackoverflow.com/q/255147/9325817
Vignesh Bayari R.

Jawaban:


2535

Di Python 3, Anda dapat menggunakan sep=dan end=parameter printfungsi:

Untuk tidak menambahkan baris baru ke akhir string:

print('.', end='')

Untuk tidak menambahkan spasi di antara semua argumen fungsi yang ingin Anda cetak:

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

Anda dapat meneruskan string apa pun ke parameter mana pun, dan Anda dapat menggunakan kedua parameter sekaligus.

Jika Anda mengalami masalah dengan buffering, Anda dapat menyiram output dengan menambahkan flush=Trueargumen kata kunci:

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

Python 2.6 dan 2.7

Dari Python 2.6 Anda dapat mengimpor printfungsi dari Python 3 menggunakan __future__modul :

from __future__ import print_function

yang memungkinkan Anda untuk menggunakan solusi Python 3 di atas.

Namun, perhatikan bahwa flushkata kunci tidak tersedia dalam versi printfungsi yang diimpor dari __future__dalam Python 2; ini hanya bekerja di Python 3, lebih khusus lagi 3.3 dan yang lebih baru. Dalam versi sebelumnya Anda masih perlu menyiram secara manual dengan panggilan ke sys.stdout.flush(). Anda juga harus menulis ulang semua pernyataan cetak lainnya dalam file tempat Anda melakukan impor ini.

Atau bisa Anda gunakan sys.stdout.write()

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

Anda mungkin juga perlu menelepon

sys.stdout.flush()

untuk memastikan stdoutmemerah segera.


2
Terima kasih! Dalam Python 3.6.3, flush = True itu penting, atau tidak berfungsi sebagaimana dimaksud.
Gunit

3
Dapatkah seseorang menjelaskan mengapa saya perlu melakukannya flushdan apa fungsinya sebenarnya?
Rishav

5
Ini terlambat beberapa bulan, tetapi untuk menjawab @Rishav flush mengosongkan buffer dan menampilkan output sekarang. Tanpa flush Anda mungkin memiliki teks yang tepat dicetak pada akhirnya, tetapi hanya ketika sistem berkeliling untuk memproses grafik, bukan IO. Siram membuat teks segera terlihat dengan "membersihkan" cache.
Penyu Hebat

297

Seharusnya semudah yang dijelaskan pada tautan ini oleh Guido Van Rossum:

Re: Bagaimana cara mencetak tanpa ac / r?

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

Apakah mungkin untuk mencetak sesuatu tetapi tidak secara otomatis ada carriage return yang ditambahkan?

Ya, tambahkan koma setelah argumen terakhir untuk dicetak. Misalnya, loop ini mencetak angka 0..9 pada garis yang dipisahkan oleh spasi. Perhatikan "cetak" tanpa parameter yang menambahkan baris terakhir:

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

99
Ini secara khusus tercantum dalam pertanyaan sebagai perilaku yang tidak diinginkan karena spasi
Zags

87
Sebaliknya, jawabannya harus dihapus karena dua alasan: ia memiliki efek samping yang tidak diinginkan yang tidak dapat Anda nonaktifkan (termasuk spasi tambahan), dan itu tidak dapat diteruskan dengan python 3 (tanda kurung memaksa konversi ke tuple) . Saya mengharapkan konstruksi jelek seperti ini dari PHP, bukan Python. Jadi yang terbaik adalah jangan pernah menggunakan ini.
Eric Leschinski

9
//, Ini adalah cara paling sederhana untuk menyelesaikannya dengan Python 2, dan ada BANYAK kode satu kali di luar sana untuk OS yang benar-benar tua. Mungkin bukan solusi terbaik, atau bahkan direkomendasikan. Namun, salah satu keuntungan hebat dari StackOverflow adalah ia memberi tahu kita trik aneh apa yang ada di sana. KDP, apakah Anda akan memasukkan peringatan cepat di atas tentang apa yang dikatakan @Eric Leschinski? Itu masuk akal, setelah semua.
Nathan Basanese

23
@nathanbasanese Sederhana atau tidak, ada efek samping yang tidak diinginkan penanya secara eksplisit . Diturunkan.
Shadur

8
270 memilih jawaban yang secara spesifik tidak menjawab pertanyaan. Kerja bagus, upvoting orang. Kerja bagus.
Silindris

168

Catatan: Judul pertanyaan ini dulu kira-kira seperti "Bagaimana cara mencetak dengan python?"

Karena orang mungkin datang ke sini mencarinya berdasarkan judul, Python juga mendukung subtitusi gaya 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

Dan, Anda dapat dengan mudah mengalikan nilai string:

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

10
Memang, itu tidak penting. :) Karena sudah ada jawaban yang bagus untuk pertanyaan saya hanya menguraikan beberapa teknik terkait yang mungkin terbukti bermanfaat.
Beau

8
Berdasarkan pada judul pertanyaan, saya percaya jawaban ini lebih sesuai analog dengan bagaimana orang biasa menggunakan printf di C / C ++
Dan

16
Ini menjawab judul pertanyaan, tetapi bukan tubuh. Yang mengatakan, itu memberi saya apa yang saya cari. :)
ayman

2
itu bukan jawaban untuk pertanyaan
Vanuan

4
@Vanuan, saya menjelaskan di bagian bawah jawaban saya bahwa judul pertanyaan berubah di beberapa titik. :)
Beau

93

Gunakan fungsi cetak gaya-python3 untuk python2.6 + (juga akan memecah pernyataan cetak kata kunci yang ada dalam file yang sama.)

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

Untuk tidak merusak semua kata kunci cetak python2 Anda, buat printf.pyfile terpisah

# printf.py

from __future__ import print_function

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

Kemudian, gunakan di file Anda

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

Lebih banyak contoh yang menunjukkan gaya printf

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

39

Cara mencetak pada baris yang sama:

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

27

Fungsi baru (pada Python 3.x) printmemiliki endparameter opsional yang memungkinkan Anda mengubah karakter akhir:

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

Keluaran:

HELLOHELLO

Ada juga sepuntuk pemisah:

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

Keluaran:

HALO HALO HALO

Jika Anda ingin menggunakan ini di Python 2.x cukup tambahkan ini di awal file Anda:

from __future__ import print_function


1
apa yang "sep" lakukan?
McPeppr

1
@ McPeppr Saya tahu ini sudah lama tapi saya sudah mengedit jawaban untuk lebih jelasnya. Periksa sekarang.
TheTechRobo36414519

Terima kasih atas hasil editnya. September akan berguna. Sejauh ini saya menggunakan sep.join (daftar) untuk menggabungkan elemen daftar dengan pemisah di antaranya - sempurna untuk menulis file csv
McPeppr

21

Menggunakan functools.partial untuk membuat fungsi baru yang disebut printf

>>> import functools

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

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

Cara mudah untuk membungkus suatu fungsi dengan parameter default.


16

Anda bisa menambahkan ,di akhir printfungsi sehingga tidak akan mencetak pada baris baru.


1
//, Ini benar-benar membuatnya tidak mencetak apa-apa. Tidakkah kita perlu menambahkan pernyataan cetak lain tanpa argumen di akhir, seperti yang ditunjukkan pada stackoverflow.com/a/493500/2146138 ? Apakah Anda bersedia mengedit jawaban ini dengan contoh singkat dua atau tiga baris?
Nathan Basanese

3
OP tidak ingin ruang ditambahkan
pppery

2
Tidak menjawab pertanyaan. Tidak ada ruang.
shrewmouse

Ini tidak lagi berfungsi di Python 2.x dan hanya menjawab setengah dari yang diinginkan OP. Mengapa 16 upvotes?
TheTechRobo36414519

12

Dalam Python 3+, printadalah suatu fungsi. Saat Anda menelepon

print('hello world')

Python menerjemahkannya menjadi

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

Anda dapat mengubah endapa pun yang Anda inginkan.

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

jika ruang ekstra OK setelah setiap cetak, dengan python 2

print '.',

menyesatkan dalam python 2 - hindari :

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

Anda dapat mencoba:

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

Anda dapat melakukan hal yang sama di python3 sebagai berikut:

#!usr/bin/python

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

dan jalankan dengan python filename.pyataupython3 filename.py


5

Saya baru-baru punya masalah yang sama ..

saya menyelesaikannya dengan melakukan:

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)

ini berfungsi baik di unix dan windows ... belum mengujinya di macosx ...

hth


2
Istirahatsys.__stdout__
pppery

4

@ lenooh memenuhi permintaan saya. Saya menemukan artikel ini ketika mencari 'python suppress newline'. Saya menggunakan IDLE3 pada Raspberry Pi untuk mengembangkan Python 3.2 untuk Putty. Saya ingin membuat progress bar di baris perintah Putty. Saya tidak ingin halamannya bergulir. Saya ingin garis horizontal untuk meyakinkan kembali pengguna dari ketakutan bahwa program belum terhenti atau telah dikirim untuk makan siang pada putaran tak terbatas yang meriah - sebagai permohonan untuk 'tinggalkan aku, saya baik-baik saja, tetapi ini mungkin membutuhkan waktu. ' pesan interaktif - seperti bilah progres dalam teks.

The print('Skimming for', search_string, '\b! .001', end='')menginisialisasi pesan dengan mempersiapkan untuk layar-write berikutnya, yang akan mencetak tiga backspaces sebagai rubout ⌫⌫⌫ dan kemudian periode, menyeka '001' dan memperluas garis periode. Setelah search_stringinput pengguna burung beo, \b!trim tanda seru search_stringteks saya untuk kembali ke ruang yang print()sebaliknya memaksa, menempatkan tanda baca dengan benar. Itu diikuti oleh spasi dan 'titik' pertama dari 'progress bar' yang saya simulasi. Tanpa perlu, pesan juga kemudian dipilah dengan nomor halaman (diformat hingga panjang tiga dengan angka nol di depan) untuk memperhatikan dari pengguna bahwa kemajuan sedang diproses dan yang juga akan mencerminkan jumlah periode yang nantinya akan kita buat hingga Baik.

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

Daging progress bar ada di sys.stdout.write('\b\b\b.'+format(page, '03'))barisan. Pertama, untuk menghapus ke kiri, itu akan mencadangkan kursor di atas tiga karakter numerik dengan '\ b \ b \ b' sebagai out menggosok dan menjatuhkan periode baru untuk menambah panjang bilah kemajuan. Kemudian ia menulis tiga digit halaman yang telah berkembang sejauh ini. Karena sys.stdout.write()menunggu buffer penuh atau saluran output ditutup, sys.stdout.flush()memaksa penulisan langsung. sys.stdout.flush()dibangun ke ujung print()yang dilewati dengan print(txt, end='' ). Kemudian kode loop melalui operasi intensif waktu duniawi sementara itu mencetak tidak lebih sampai kembali ke sini untuk menghapus tiga digit kembali, menambahkan titik dan menulis tiga digit lagi, bertambah.

Tiga digit yang dihapus dan ditulis ulang sama sekali tidak perlu - itu hanya berkembang yang dicontohkan sys.stdout.write()versus print(). Anda dapat dengan mudah prime dengan titik dan lupakan tiga backslash-b ⌫ backspace mewah (tentu saja tidak menulis jumlah halaman diformat juga) dengan hanya mencetak periode bar lebih lama dengan satu setiap kali melalui - tanpa spasi atau baris menggunakan hanya dengan sys.stdout.write('.'); sys.stdout.flush()pasangan.

Harap dicatat bahwa shell Raspberry Pi IDLE3 Python tidak menghormati backspace sebagai ⌫ rubout tetapi malah mencetak spasi, sebagai gantinya membuat daftar pecahan yang jelas.

- (o = 8> ahli


4

Anda akan melihat bahwa semua jawaban di atas benar. Tetapi saya ingin membuat jalan pintas untuk selalu menulis parameter "end = ''" pada akhirnya.

Anda bisa mendefinisikan fungsi seperti

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

Itu akan menerima semua jumlah parameter. Bahkan ia akan menerima semua parameter lain seperti file, flush, dll dan dengan nama yang sama.


Itu tidak berjalan, itu keluhan yang *argada di awal (python 2.7), dan meletakkannya di akhir memang berjalan, tetapi tidak berfungsi sepenuhnya benar. Saya mendefinisikan fungsi yang hanya mengambil Print(*args), dan kemudian hanya disebut mencetak dengan sep='', end=''. Dan sekarang berfungsi seperti yang saya inginkan. Jadi satu suara untuk ide.
Otzen

4

Banyak dari jawaban ini agak rumit. Di Python 3.x Anda cukup melakukan ini:

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

Nilai default akhir adalah "\n". Kami hanya mengubahnya menjadi spasi atau Anda juga dapat menggunakan end=""(tanpa spasi) untuk melakukan apa yang printfbiasanya dilakukan.


3

Anda ingin mencetak sesuatu untuk loop yang benar, tetapi Anda tidak ingin itu mencetak di baris baru setiap kali .. misalnya:

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

 OUTPUT:
    hi
    hi
    hi
    hi
    hi

tetapi Anda ingin mencetak seperti ini: hi hi hi hi hi hi kan ???? cukup tambahkan koma setelah mencetak "hai"

Contoh:

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


5
Tidak, OP ingin hihihihihi, bukan hi hi hi hi hi
Cool Javelin

1

Atau memiliki fungsi seperti:

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

Kemudian sekarang:

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

Output:

0123456789

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

Ini bekerja di 2.7.8 & 2.5.2 (Kanopi dan terminal OSX, masing-masing) - tidak memerlukan impor modul atau perjalanan waktu.


8
Itu mencetak karakter backspace ke output standar. Mungkin terlihat benar jika output standar adalah terminal, tetapi jika diarahkan ke file, file tersebut akan berisi karakter kontrol.
Keith Thompson

1
Benar, tapi aku tidak bisa membayangkan bahwa ada orang yang ingin menggunakan ini untuk apa pun selain kemajuan berteknologi rendah bar ...
tyersome

1
Namun demikian, kode Python tidak melakukan hal yang sama dengan kode C dalam pertanyaan.
Keith Thompson

Anda dapat menguji dengan sys.stdout.isatty()jika tidak diarahkan ke file.
fcm

0

Ada dua cara umum untuk melakukan ini:

Cetak tanpa baris baru dengan Python 3.x

Tidak menambahkan apa pun setelah pernyataan cetak dan menghapus '\ n' dengan menggunakan end='' sebagai:

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

Contoh lain dalam Loop :

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

Cetak tanpa baris baru dengan Python 2.x

Menambahkan tanda koma mengatakan bahwa setelah cetak abaikan \n.

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

Contoh lain dalam Loop :

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

Semoga ini bisa membantu Anda. Anda dapat mengunjungi tautan ini .


Bagaimana dengan ruangnya?
shrewmouse

gunakan end=" "misalnya: print ('hello', end = '' "); print ('world')
susan097

Solusi 2.7 Anda tidak menghilangkan ruang.
shrewmouse

Saya menyebutkan bahwa hapus '\ n' bukan spasi, ruang secara default di python2. Lihat apa yang terlihat: print 'hello' ;print'there'di paiza.io/projects/e/35So9iUPfMdIORGzJTb2NQ
susan097

Benar, itu sebabnya jawaban Anda tidak dipilih. Anda tidak menjawab pertanyaan, "Bagaimana cara mencetak tanpa baris baru atau spasi?". Jawaban Anda untuk 2.x tidak menjawab pertanyaan. Jawaban Anda untuk 3.0 sama dengan banyak jawaban lain yang diposting lebih dari sembilan tahun yang lalu. Sederhananya, jawaban ini menambahkan tidak ada yang berguna bagi komunitas dan Anda harus menghapusnya.
shrewmouse

-3

... Anda tidak perlu mengimpor perpustakaan apa pun. Cukup gunakan karakter hapus:

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

ini menghilangkan baris baru dan spasi (^ _ ^) *

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.