2012-04-10 4 views
3

Ich machte eine kleine App, im Grunde an einem bestimmten Punkt rufe ich die distutils.dir_util.copy_tree, die die Datei an das Ziel kopieren. Würde mir jemand helfen, ein grundlegenden Fortschrittsbalken wie zum Verlinken:Python, wie man einen Fortschrittsbalken mit distutils.dir_util.copy_tree verbindet

[======]50% 

zum Kopiervorgang ... leider kann ich nicht glaube, ich sehne es wird nehmen Sie den Ordner-Baum zu kopieren, da es würde ‚s sein anders von Zeit zu Zeit. Vielen Dank im Voraus an jeden, der mir antworten wird.

Antwort

3

distutils.dir_util.copy_tree() bietet keinen Rückruf, den Sie dafür verwenden können. Sie müssen os.walk() verwenden, um die Dateisystemobjekte aufzuzählen, und dann shutil.copy[2]() verwenden, um die tatsächlichen Objekte zu kopieren.

+0

danke Ignacio, ich dachte, ich könnte einen einfachen Fortschrittsbalken in der distutils.dir_util.copy_tree() 'Foor-Schleife' anzeigen ... ist das nicht möglich? – nassio

+1

Nicht mit stdlib Code herumschrauben. –

+0

@nassio, Sie müssen es trotzdem in zwei Durchgänge aufteilen - Sie müssen die Gesamtanzahl der Dateien kennen, bevor Sie mit dem Kopieren beginnen. –

0

Wie in Python doc erklärt, können Sie einen Rückruf zur Verfügung stellen kann, um shutil .copybaum.

from shutil import copytree 

def _countFiles(path, names): 
    #do someting with "path" and "names" 
    return [] # nothing will be ignored 

copytree(source, destination, ignore=_countFiles) 

Ich habe keinen Code geschrieben Fortschritte zu bekommen, aber Sie erhalten den Punkt:

  1. Anzahl Dateien im Verzeichnis (und Unterverzeichnisse)
  2. in "_countFiles", erhöhen Sie die Zahl von bearbeiteten Dateien
  3. Fortschritt = nb_processed_files * 100/nb_total_files

Grüße

+0

Das ist falsch. Die Python-Dokumente geben eindeutig an, dass die ignorable callable einmal pro (Unter) -Verzeichnis aufgerufen wird, das kopiert wird, wobei das Verzeichnis und die Liste der Dateien in das aufrufbare Verzeichnis übergeben werden. Dies bietet keinen Mechanismus für den Fortschritt, da es nur einmal pro Verzeichnis und nicht pro Datei aufgerufen wird. Angenommen, Sie haben 10.000 Dateien in einem Verzeichnis gespeichert. Die Ignorierung würde einmal aufgerufen werden, um zu sehen, welche Dateien ignoriert werden sollen, und nie wieder, so dass der Fortschritt nicht mehr verfolgt werden kann. – user1610729

+0

Das ist ein guter Punkt. Zumindest hast du Fortschritte nach Verzeichnis :) – Samoht

Verwandte Themen