Əvvəlki çıxış kimi eyni xəttə çıxmaq? python (2,5)

Sadə FTP yükləyicisini yazıram. Kodun bir hissəsi belədir:

 ftp.retrbinary("RETR " + file_name, process) 

Geri çağırışı idarə etmək üçün funksiya funksiyasını çağırıram:

 def process(data): print os.path.getsize(file_name)/1024, 'KB / ', size, 'KB downloaded!' file.write(data) 

və çıxış belə görünür:

 1784 KB / KB 1829 downloaded! 1788 KB / KB 1829 downloaded! etc... 

, ancaq bu xəttini çap etdirmək və növbəti dəfə yenidən çap etdirmək / yeniləmək istəyirik, buna yalnız bir dəfə göstərəcəyik və bu yükləmənin gedişini görürəm ...

Bu necə edilə bilər?

66
04 февр. Kristian 04 fevral 2011-02-04 14:13 '11 at 2:13 pm 2011-02-04 14:13
@ 6 cavablar

Python 3.x üçün kod:

 print(os.path.getsize(file_name)/1024+'KB / '+size+' KB downloaded!', end='\r') 

end= açar söz burada işləyən şeydir - default print() default print() olaraq, print() yeni bir satırla ( \n ) sona çatır, lakin bu başqa bir dize ilə əvəz edilə bilər. Bu halda, satırın əvəzli xəttinin sonu əvəzinə kursoru cari xəttin başlanğıcına qaytarır. Beləliklə, sys modulunu bu cür sadə istifadə üçün idxal etmək lazım deyil. print() kodu kodunu əhəmiyyətli dərəcədə asanlaşdırmaq üçün istifadə edilə biləcək bir sıra söz arqumentlərinə malikdir.

Eyni Python 2.6 + kodunu istifadə etmək üçün, faylın yuxarısına aşağıdakı satırı daxil edin:

 from __future__ import print_function 
111
08 дек. Cavab Kudzu 08 dekabr tərəfindən verilir . 2011-12-08 22:56 '11 at 22:56 2011-12-08 22:56

Bütün etmək istəyirsinizsə, bir xətt dəyişir, \r istifadə edin. Carriage return gəlir deməkdir. Effekt cari xəttin başlanğıcında daşıyıcıya qayıtmaqdır. Heç bir şeyi silmir. Eynilə, \b tək bir karakterə keçmək üçün istifadə edilə bilər. (bəzi terminallar bu xüsusiyyətlərin hamısını dəstəkləməyəcək)

border=0
 import sys def process(data): size_str = os.path.getsize(file_name)/1024, 'KB / ', size, 'KB downloaded!' sys.stdout.write('%s\r' % size_str) sys.stdout.flush() file.write(data) 
35
04 февр. Cavab Sam Dolan tərəfindən verilmişdir 04 fevral. 2011-02-04 14:17 '11 at 14:17 2011-02-04 14:17

Curses moduluna nəzər salın və modul HOWTO sənədlərini lənətləyin .

Həqiqətən əsas bir nümunə:

 import time import curses stdscr = curses.initscr() stdscr.addstr(0, 0, "Hello") stdscr.refresh() time.sleep(1) stdscr.addstr(0, 0, "World! (with curses)") stdscr.refresh() 
15
04 февр. Andrea Spadaccini tərəfindən verilmiş cavab 04 fevral. 2011-02-04 14:17 '11 at 14:17 2011-02-04 14:17

İşdə mətn bloklarını yenidən yaza biləcəyim kiçik sinifdir. Əvvəlki mətni düzgün şəkildə təmizləyir, belə ki köhnə mətni bir mess yaratmadan daha qısa bir yeni mətn ilə yaza bilərsiniz.

 import re, sys class Reprinter: def __init__(self): self.text = '' def moveup(self, lines): for _ in range(lines): sys.stdout.write("\x1b[A") def reprint(self, text): # Clear previous text by overwritig non-spaces with spaces self.moveup(self.text.count("\n")) sys.stdout.write(re.sub(r"[^\s]", " ", self.text)) # Print new text lines = min(self.text.count("\n"), text.count("\n")) self.moveup(lines) sys.stdout.write(text) self.text = text reprinter = Reprinter() reprinter.reprint("Foobar\nBazbar") reprinter.reprint("Foo\nbar") 
9
23 марта '13 в 14:07 2013-03-23 14:07 Cavab Bouke Versteegh tərəfindən 23 Mart 2013 tarixində saat 14:07 'də verilir. 2013-03-23 ​​14:07

Mən python 2.7-də sadə bir bəyanat üçün '\r' sonra sonunda bir virgül qoyduq.

 print os.path.getsize(file_name)/1024, 'KB / ', size, 'KB downloaded!\r', 

Bu, python 3-dən başqa digər həllərdən daha kiçikdir, həm də saxlamaq üçün daha çətindir.

6
27 апр. Cavab Matt Ellen 27 Aprel. 2014-04-27 01:10 '14 da 1:10 2014-04-27 01:10

Sadəcə, xəttin sonunda '\ r', həmçinin yazdırma işinin sonunda virgül əlavə edə bilərsiniz. Məsələn:

 print(os.path.getsize(file_name)/1024+'KB / '+size+' KB downloaded!\r'), 
3
19 нояб. Cavab 19 noyabr tarixində Moustafa Saleh tərəfindən verilmişdir. 2014-11-19 20:40 '14 saat 20:40 'də 2014-11-19 20:40

etiketləri ilə bağlı digər suallar və ya bir sual verin