Domanda

Molti moduli che uso importano interi file in memoria o copiano il contenuto di un file mentre lo elaborano. Mi chiedo se c'è un modo per tenere traccia di questo tipo di avanzamento del caricamento? Forse una classe wrapper che accetta un callback?

È stato utile?

Soluzione

Lo farei determinando la dimensione del file e quindi semplicemente dividendo il totale per il numero di byte letti. In questo modo:

import os

def show_progress(file_name, chunk_size=1024):
    fh = open(file_name, "r")
    total_size = os.path.getsize(file_name)
    total_read = 0
    while True:
        chunk = fh.read(chunk_size)
        if not chunk: 
            fh.close()
            break
        total_read += len(chunk)
        print "Progress: %s percent" % (total_read/total_size)
        yield chunk

for chunk in show_progress("my_file.txt"):
    # Process the chunk
    pass 

Modifica: So che non è il codice migliore, ma volevo solo mostrare il concetto.

Altri suggerimenti

Se effettivamente intendi " import " (non " leggi ") quindi puoi sovrascrivere le definizioni del modulo di importazione. Puoi aggiungere funzionalità di temporizzazione.

Vedi il modulo imp .

Se intendi " leggi " ;, allora puoi avvolgere banalmente i file Python con il tuo wrapper simile a un file. I file non espongono troppi metodi. Puoi ignorare quelli interessanti per ottenere i dati di temporizzazione.

>>> class MyFile(file):
...     def read(self,*args,**kw):
...         # start timing
...         result= super(MyFile,self).read(*args,**kw)
...         # finish timing
...         return result
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top