Jika saya memiliki kode berikut:
for x in range(10):
print x
Saya akan mendapatkan hasil dari
1
2
etc..
Yang ingin saya lakukan adalah daripada mencetak baris baru, saya ingin mengganti nilai sebelumnya dan menimpanya dengan nilai baru pada baris yang sama.
Jawaban:
Salah satu caranya adalah dengan menggunakan karakter carriage return (
'\r'
) untuk kembali ke awal baris tanpa melanjutkan ke baris berikutnya:Koma di akhir pernyataan cetak memberitahu itu untuk tidak pergi ke baris berikutnya. Pernyataan cetak terakhir maju ke baris berikutnya sehingga prompt Anda tidak akan menimpa hasil akhir Anda.
Memperbarui
Sekarang Python 2 adalah EOL, jawaban Python 3 lebih masuk akal. Untuk Python 3.5 dan sebelumnya:
Di Python 3.6 dan yang lebih baru, f-string terbaca lebih baik:
sumber
%
operator usang. Pada dasarnya, semua string sekarang memiliki metode format . Dalam hal ini,{0}
artinya "argumen pertama untukformat()
" (penghitungan dimulai dari 0).re.sub(r'\$<\d+>[/*]?', '', curses.tigetstr('el') or '')
akan memberi Anda string hapus-ke-akhir-baris yang benar untuk terminal apa pun yang dimiliki pengguna. Ingatlah untuk menginisialisasicurses
dengan sesuatu seperticurses.setupterm(fd=sys.stdout.fileno())
, dan gunakansys.stdout.isatty()
untuk memastikan keluaran Anda tidak diarahkan ke sebuah file. Lihat code.activestate.com/recipes/475116 untuk modul Python lengkap dengan kontrol kursor dan dukungan warna.import curses; curses.setupterm(fd=sys.stdout.fileno()); print(hex(curses.tigetstr('cr')));
Ini harus mencetak kode hex dari urutan karakter untuk pergi ke awal baris.Karena saya berakhir di sini melalui Google tetapi menggunakan Python 3, berikut ini cara kerjanya dengan Python 3:
Jawaban terkait di sini: Bagaimana saya bisa menyembunyikan baris baru setelah pernyataan cetak?
sumber
testing
dan loop kedua Anda mencetaktest
output setelah lintasan kedua akan tetaptesting
- sekarang saya melihat bahwa @ Nagasaki45 menunjukkan hal iniprint("\r", message, end="")
Jawaban @Mike DeSimone mungkin akan berhasil sebagian besar waktu. Tapi...
Ini karena
'\r'
hanya kembali ke awal baris tetapi tidak menghapus keluaran.EDIT: Solusi yang lebih baik (dari proposal lama saya di bawah)
Jika dukungan POSIX cukup untuk Anda, berikut ini akan menghapus baris saat ini dan meninggalkan kursor di awal:
Ia menggunakan kode escape ANSI untuk menghapus jalur terminal. Info lebih lanjut dapat ditemukan di wikipedia dan dalam pembicaraan hebat ini .
Jawaban lama
Solusi (tidak begitu bagus) yang saya temukan terlihat seperti ini:
Salah satu keuntungannya adalah ini akan berfungsi di windows juga.
sumber
Saya memiliki pertanyaan yang sama sebelum mengunjungi utas ini. Bagi saya sys.stdout.write bekerja hanya jika saya benar menyiram buffer yaitu
Tanpa pembilasan, hasilnya hanya dicetak di akhir skrip
sumber
stringvar.ljust(10,' ')
dalam kasus string dengan panjang variabel.Tekan baris baru dan cetak
\r
.atau tulis ke stdout:
sumber
Coba ini:
Itu berhasil untuk saya. Bagian
end="\r"
tersebut membuatnya menimpa baris sebelumnya.PERINGATAN!
Jika Anda mencetak
hi
, kemudian mencetakhello
menggunakan\r
, Anda akan mendapatkanhillo
karena output menulis di atas dua huruf sebelumnya. Jika Anda mencetakhi
dengan spasi (yang tidak muncul di sini), maka itu akan munculhi
. Untuk mengatasinya, cetak spasi menggunakan\r
.sumber
Hi BobHi BobHi BobHi BobHi Bob
. Python 3.7.1\r
adalah di awal, bukan di akhir.Saya tidak bisa mendapatkan solusi apa pun di halaman ini agar berfungsi untuk IPython , tetapi sedikit variasi pada solusi @ Mike-Desimone melakukan pekerjaan itu: alih-alih mengakhiri jalur dengan pengembalian kereta, mulailah baris dengan pengembalian kereta:
Selain itu, pendekatan ini tidak memerlukan pernyataan cetak kedua.
sumber
time.sleep (0,5) adalah untuk menunjukkan bagaimana keluaran sebelumnya dihapus dan keluaran baru dicetak "\ r" ketika di awal pesan cetak, itu akan menghapus keluaran sebelumnya sebelum keluaran baru.
sumber
Ini berfungsi pada Windows dan python 3.6
sumber
Jawaban yang diterima tidaklah sempurna . Baris yang dicetak pertama akan tetap di sana dan jika cetakan kedua Anda tidak menutupi seluruh baris baru, Anda akan berakhir dengan teks sampah.
Untuk mengilustrasikan masalah, simpan kode ini sebagai skrip dan jalankan (atau lihat saja):
Outputnya akan terlihat seperti ini:
Apa yang berhasil bagi saya adalah menghapus garis sebelum meninggalkan cetakan permanen. Jangan ragu untuk menyesuaikan dengan masalah spesifik Anda:
Dan sekarang tercetak seperti yang diharapkan:
sumber
Berikut adalah versi jawaban @ Nagasaki45 yang lebih bersih, lebih "plug-and-play". Tidak seperti banyak jawaban lain di sini, ini berfungsi dengan baik dengan string dengan panjang berbeda. Ini mencapai ini dengan membersihkan garis dengan spasi sebanyak panjang baris terakhir yang dicetak. Juga akan bekerja di Windows.
Pemakaian
Cukup gunakan seperti ini:
Tes kecil ini menunjukkan bahwa garis dibersihkan dengan benar, bahkan untuk panjang yang berbeda:
sumber
Saya agak terkejut tidak ada yang menggunakan karakter spasi mundur. Ini salah satu yang menggunakannya.
sumber
sys.stdout.flush()
(Python3) Inilah yang berhasil untuk saya. Jika Anda hanya menggunakan \ 010 maka itu akan meninggalkan karakter, jadi saya men-tweaknya sedikit untuk memastikan itu menimpa apa yang ada di sana. Ini juga memungkinkan Anda untuk memiliki sesuatu sebelum item cetakan pertama dan hanya menghapus panjang item.
sumber
Satu jawaban lagi berdasarkan jawaban yang ada.
Isi pbar.py: import sys, shutil, datetime
Penggunaan skrip:
sumber
Inilah solusi saya! Windows 10, Python 3.7.1
Saya tidak yakin mengapa kode ini berfungsi, tetapi sepenuhnya menghapus baris aslinya. Saya menyusunnya dari jawaban sebelumnya. Jawaban lain hanya akan mengembalikan baris ke awal, tetapi jika Anda memiliki baris yang lebih pendek setelah itu, akan terlihat kacau seperti
hello
berubah menjadibyelo
.Output - Setiap baris akan ditulis ulang tanpa ada teks lama yang menunjukkan:
Baris berikutnya (ditulis ulang sepenuhnya pada baris yang sama):
sumber
Lebih baik menimpa seluruh baris jika tidak baris baru akan bercampur dengan yang lama jika baris baru lebih pendek.
Harus digunakan
columns - 1
di Windows.sumber