2011-02-04 87 views
53

我正在寫一個簡單的ftp下載器。到部分代碼是這樣的:輸出到同一行覆蓋以前的輸出? python(2.5)

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

我打電話功能的進程來處理回調:

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

和輸出是這樣的:

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

我希望它打印這一行,下次重印/刷新它,所以它只會顯示一次,我會看到下載的進度...

怎麼辦?

回答

95

下面是Python的3.x的代碼:

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

end=關鍵字是什麼做的工作在這裏 - 在默認情況下,print()在結束換行符(\n)字符,但可以用不同的字符串替換。在這種情況下,用回車結束該行而不是將光標返回到當前行的開始位置。因此,不需要爲這種簡單用法導入sys模塊。 print()實際上有a number of keyword arguments它可以用來大大簡化代碼。

要使用Python的2.6+相同的代碼,把下面一行在文件的頂部:

from __future__ import print_function 
14

看看curses module documentationcurses module HOWTO

很基本的例子:

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() 
+7

不幸的是,curses只能在Unix上使用。操作系統沒有告訴我們他的應用程序的目標是哪個操作系統... – 2011-02-04 11:28:50

+2

我需要它的Windows – Kristian 2011-02-04 11:45:55

+0

我很習慣在Linux下工作,我甚至沒有注意到關於該模塊只針對UNIX中的警告模塊文檔..感謝您指出,@Adrien。 – 2011-02-04 11:50:10

32

如果你想要做的是改變單一的線,使用\r\r表示回車。它的效果僅僅是將光標放回當前行的開頭。它不會擦除任何東西。同樣,\b可以用於向後移動一個字符。 (有些終端可能不支持所有這些功能)

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

這裏是我的小類,可以重新打印的文本塊。它正確地清除了以前的文本,因此您可以用較短的新文本覆蓋舊文本而不會造成混亂。

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") 
5

我發現,在Python 2.7一個簡單的print語句,只是把一個逗號末的'\r'後。

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

這比其他非python 3解決方案更短,但也更難以維護。

3

只需在字符串末尾加上'\ r'加上打印功能末尾的逗號即可。例如:

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