2012-02-29 9 views
0

5秒ごとにどのくらいのファイルが処理されるかを報告する方法はありますか?私はスレッドが必要だと思いますが、どのように制御されていますか?大きなファイルを処理中に進行状況を報告する方法はありますか?

#!/bin/env python 
# -*- coding: utf8 -*- 

import os 
import sys 
import logging 
import hashlib 

logger = logging.getLogger() 
FORMAT = "%(asctime)s %(levelname)s: %(message)s" 
logging.basicConfig(format=FORMAT, level=logging.DEBUG, datefmt="%H:%M:%S") 

class fileScanner: 
    readBytes = 0 
    lastReadBytes = 0 
    fileSize = 0 
    reportSeconds = 5 

    def scanFile(self, filePath): 
    self.readBytes = 0 
    self.lastReadBytes = 0 

    logging.getLogger() 
    self.fileSize = os.path.getsize(filePath) 

    with open(filePath, 'rb') as f: 
     m = hashlib.sha512() 
     while True: 
     data = f.read(1024) 
     if not data: 
      break 
     self.readBytes += len(data) 
     m.update(data) 
     return m.hexdigest() 
    raise IOError("Couldn't process file '%s'" % filePath) 

    def reportProcess(self): 
    logging.getLogger() 
    percent = float((self.readBytes/self.fileSize) * 100) 
    secAvg = (self.readBytes - self.lastReadBytes)/self.reportSeconds 
    estimatedTime = (self.fileSize - self.readBytes)/secAvg 
    logging.info("%s%% (%s/%s bytes) read in average of %s MB/sec. Estimated time left: %s seconds." % (percent, self.readBytes, self.fileSize, secAvg, estimatedTime)) 
    self.lastReadBytes = self.readBytes 


if __name__ == "__main__": 
    fs = fileScanner() 
    hash = fs.scanfile('largefile.dat') 

reportProcess()をどのように開始して終了しますか?

はい計算が間違っている可能性があります。

+1

fs = fileScannerを実行すると、fileScannerのインスタンスは作成されません。あなたはクラスオブジェクトをfsに割り当てるだけです。 fs = fileScanner()にする必要があります。 –

答えて

1

読み取りループでは、reportProcessを5秒ごとに呼び出します。

lastTime = time.time() 
while True: 
    data = f.read(1024) 
    if not data: 
     break 
    self.readBytes += len(data) 
    if time.time() - lastTime > 5: 
        self.reportProcess() 
        lastTime = time.time() 

未定:クラスレベルの属性を使用している理由は、通常はインスタンスレベルである必要があります。

class FileScanner: 
    def __init__(self): 
     self.readBytes = 0 
     self.lastReadBytes = 0 
+0

クラスレベルの属性を使用して、インスタンスが所有する属性を指定し、それらを* sphinx-doc *に公開します。 –

0

は、あなただけのwhileループ内scanFile()関数内からreportProcess()を呼び出すことができます。たとえば、xバイトごとにreportProcess()(whileループの中に条件を追加する)を呼び出します。それはあなたの問題を解決するだろうか?

関連する問題