Saya ingin membuat beberapa pernyataan yang memberikan output standar tanpa melihat baris baru di antara pernyataan.
Secara khusus, misalkan saya punya:
for item in range(1,100):
print item
Hasilnya adalah:
1
2
3
4
.
.
.
Bagaimana ini bisa terlihat seperti:
1 2 3 4 5 ...
Lebih baik lagi, mungkinkah mencetak nomor tunggal di atas angka terakhir, jadi hanya satu nomor yang ada di layar pada satu waktu?
Jawaban:
Ubah
print item
ke:print item,
dalam Python 2.7print(item, end=" ")
dalam Python 3Jika Anda ingin mencetak data secara dinamis, gunakan sintaks berikut:
print(item, sep=' ', end='', flush=True)
dalam Python 3sumber
'\n'
Karakter ditulis di bagian akhir, kecualiprint
pernyataan berakhir dengan koma. Ini adalah satu-satunya tindakan jika pernyataan itu hanya berisi kata kunciprint
.flush
tidak berhasilfrom __future__ import print_function
.print(item, end=", ")
kemudian juga menambahkan,
ke item terakhir bagaimana cara mencegahnya menambahkan,
ke item terakhirSecara umum, cara untuk melakukannya adalah dengan kode kontrol terminal . Ini adalah kasus yang sangat sederhana, di mana Anda hanya memerlukan satu karakter khusus: U + 000D CARRIAGE RETURN, yang ditulis
'\r'
dalam Python (dan banyak bahasa lainnya). Berikut ini adalah contoh lengkap berdasarkan kode Anda:Beberapa hal tentang ini yang mungkin mengejutkan:
\r
berjalan pada awal string sehingga, sementara program ini berjalan, kursor akan selalu setelah nomor. Ini bukan hanya kosmetik: beberapa emulator terminal menjadi sangat bingung jika Anda melakukannya sebaliknya.stdout.flush
diperlukan pada beberapa sistem, atau Anda tidak akan mendapatkan output apa pun. Sistem lain mungkin tidak memerlukannya, tetapi tidak membahayakan.Jika ternyata ini tidak berhasil, hal pertama yang harus Anda curigai adalah emulator terminal Anda bermasalah. Program vttest dapat membantu Anda mengujinya.
Anda bisa mengganti
stdout.write
denganprint
pernyataan tetapi saya memilih untuk tidak mencampurprint
dengan penggunaan langsung objek file.sumber
flush()
memaksa file untuk mengirim apa pun yang ada ke sistem operasi sekarang. Saya terkejut itu bekerja untuk Anda tanpa itu - itu tidak bekerja untuk saya sampai saya menambahkannya.ncurses
untuk melakukannya.sys.stdout.flush()
tampaknya tidak baik pada sayaFreebsd
denganPython 2.7
Gunakan
print item,
untuk membuat pernyataan cetak menghilangkan baris baru.Dalam Python 3, itu
print(item, end=" ")
.Jika Anda ingin setiap angka ditampilkan di tempat yang sama, gunakan misalnya (Python 2.7):
Dalam Python 3, ini sedikit lebih rumit; di sini Anda perlu menyiram
sys.stdout
atau tidak akan mencetak apa pun sampai setelah loop selesai:sumber
Seperti contoh lainnya,
saya menggunakan pendekatan yang serupa tetapi alih-alih menghabiskan waktu menghitung panjang keluaran terakhir, dll.
Saya cukup menggunakan kode ANSI lolos untuk kembali ke awal baris dan kemudian menghapus seluruh baris sebelum mencetak output status saya saat ini.
Untuk digunakan dalam loop iterasi Anda, Anda hanya akan memanggil sesuatu seperti:
Lihat lebih lanjut di sini
sumber
Anda dapat menambahkan tanda koma pada pernyataan cetak Anda untuk mencetak spasi alih-alih baris baru di setiap iterasi:
Atau, jika Anda menggunakan Python 2.6 atau yang lebih baru, Anda dapat menggunakan fungsi cetak baru, yang akan memungkinkan Anda untuk menentukan bahwa tidak ada spasi di akhir setiap item yang sedang dicetak (atau memungkinkan Anda menentukan apa pun yang Anda inginkan) ingin):
Akhirnya, Anda dapat menulis langsung ke output standar dengan mengimpornya dari modul sys, yang mengembalikan objek seperti file:
sumber
perubahan
untuk
sumber
\033[K
kode? Saya ingin belajar lebih banyak tentang mereka.print
sudah memerah secara internal. Tidak perlu menyebutnya.print
berbeda dari disys.stdout.write()
mana Anda harus membuka layarSaya pikir bergabung sederhana harus berfungsi:
sumber
print ' '.join(str(x) for x in range(1, 10))
.Jawaban lain yang saya gunakan pada 2.7 di mana saya hanya mencetak "." setiap kali loop berjalan (untuk menunjukkan kepada pengguna bahwa hal-hal masih berjalan) adalah ini:
Ini mencetak "." karakter tanpa spasi di antara masing-masing. Terlihat sedikit lebih baik dan bekerja dengan cukup baik. \ B adalah karakter backspace untuk mereka yang bertanya-tanya.
sumber
Begitu banyak jawaban yang rumit. Jika Anda memiliki python 3, cukup letakkan
\r
di awal cetakan, dan tambahkanend='', flush=True
:Ini akan menulis
0 foo bar
, lalu1 foo bar
dll, di tempat.sumber
print('\r' + filename + " ", end = '', flush=True)
Untuk membuat angka saling menimpa, Anda dapat melakukan sesuatu seperti ini:
Itu harus bekerja selama nomor dicetak di kolom pertama.
Sunting: Ini adalah versi yang akan berfungsi walaupun tidak dicetak di kolom pertama.
Saya harus mencatat bahwa kode ini telah diuji dan berfungsi dengan baik di Python 2.5 di Windows, di konsol WIndows. Menurut beberapa orang lain, pembilasan stdout mungkin diperlukan untuk melihat hasilnya. YMMV.
sumber
"Ngomong-ngomong ...... Cara menyegarkan setiap kali sehingga mencetak mi di satu tempat hanya mengubah nomor."
Itu topik yang sangat rumit. Apa yang disarankan Zack (mengeluarkan kode kontrol konsol) adalah salah satu cara untuk mencapai itu.
Anda dapat menggunakan (n) kutukan, tetapi itu bekerja terutama pada * nixes.
Pada Windows (dan inilah bagian yang menarik) yang jarang disebutkan (saya tidak mengerti mengapa) Anda dapat menggunakan binding Python ke WinAPI ( http://sourceforge.net/projects/pywin32/ juga dengan ActivePython secara default) - bukan itu sulit dan bekerja dengan baik. Ini sebuah contoh kecil:
Atau, jika Anda ingin menggunakan
print
(pernyataan atau fungsi, tidak ada perbedaan):win32console
modul memungkinkan Anda untuk melakukan banyak hal yang lebih menarik dengan konsol windows ... Saya bukan penggemar berat WinAPI, tetapi baru-baru ini saya menyadari bahwa setidaknya setengah dari antipati saya terhadapnya disebabkan oleh penulisan kode WinAPI dalam C - pythonic bindings. lebih mudah digunakan.Semua jawaban lain bagus dan pythonic, tentu saja, tapi ... Bagaimana jika saya ingin mencetak pada baris sebelumnya ? Atau menulis teks multiline, daripada menghapusnya dan menulis baris yang sama lagi? Solusi saya memungkinkan itu.
sumber
untuk Python 2.7
untuk Python 3
sumber
sumber
Jika Anda hanya ingin mencetak angka, Anda dapat menghindari lingkaran itu.
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 89 91 91 93 94 94 96 96 98 98 99 100 mengambil 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 89 91 91 93 94 94 96 96 98 98 99 100 mengambil 491.466823551ms
sumber
map
.Cara terbaik untuk mencapai ini adalah dengan menggunakan
\r
karakterCoba saja kode di bawah ini:
sumber
Dengan Python 3 Anda bisa melakukannya dengan cara ini:
Keluaran:
Tuple: Anda dapat melakukan hal yang sama dengan tuple:
Keluaran:
Contoh lain:
Keluaran:
Anda bahkan dapat membongkar tuple Anda seperti ini:
Keluaran:
variasi lain:
Keluaran:
sumber
Koma di akhir pernyataan cetak menghilangkan baris baru.
tetapi ini tidak menimpa.
sumber
Bagi mereka yang berjuang seperti yang saya lakukan, saya datang dengan berikut ini yang tampaknya bekerja di kedua python 3.7.4 dan 3.5.2.
Saya memperluas jangkauan dari 100 menjadi 1.000.000 karena berjalan sangat cepat dan Anda mungkin tidak melihat hasilnya. Ini karena satu efek samping dari pengaturan
end='\r'
adalah bahwa perulangan putaran akhir membersihkan semua output. Diperlukan angka yang lebih panjang untuk menunjukkan bahwa itu berhasil. Hasil ini mungkin tidak diinginkan dalam semua kasus, tetapi baik-baik saja di saya, dan OP tidak menentukan satu atau lain cara. Anda dapat menghindari ini dengan pernyataan if yang mengevaluasi panjang array yang di-iterasi, dll. Kunci untuk membuatnya berfungsi dalam kasus saya adalah dengan memasangkan kurung"{}"
dengan.format()
. Kalau tidak, itu tidak berhasil.Di bawah ini harus berfungsi apa adanya:
sumber
Output: 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
sumber
Atau bahkan lebih sederhana:
end="\r"
akan menimpa dari awal [0:] cetakan pertama.sumber