J'essaye de développer un extracteur récursif. Le problème est, c'est Recursing Too Much (Evertime, il a trouvé un type d'archive) et de prendre un coup de performance.Récursivité Récurrence récursion --- Comment puis-je améliorer les performances? (Extraction récursive d'archive de Python)
Alors, comment puis-je améliorer ci-dessous le code?
Mon Idée 1:
Obtenez le 'Dict' de direcories d'abord, avec types.Filetypes de fichiers comme clés. Extrayez les types de fichiers. Quand une archive est trouvée Extraire seulement celui-là. Puis Régénérer Archive Dict à nouveau.
Mon Idée 2:
os.walk retourne Generator. Alors, y a-t-il quelque chose que je peux faire avec les générateurs? Je suis nouveau aux générateurs.
ici est le code actuel:
import os, magic
m = magic.open(magic.MAGIC_NONE)
m.load()
archive_type = [ 'gzip compressed data',
'7-zip archive data',
'Zip archive data',
'bzip2 compressed data',
'tar archive',
'POSIX tar archive',
'POSIX tar archive (GNU)',
'RAR archive data',
'Microsoft Outlook email folder (>=2003)',
'Microsoft Outlook email folder']
def extractRecursive(path ,archives):
i=0
for dirpath, dirnames, filenames in os.walk(path):
for f in filenames:
fp = os.path.join(dirpath, f)
i+=1
print i
file_type = m.file(fp).split(",")[0]
if file_type in archives:
arcExtract(fp,file_type,path,True)
extractRecursive(path,archives)
return "Done"
def arcExtract(file_path,file_type,extracted_path="/home/v3ss/Downloads/extracted",unlink=False):
import subprocess,shlex
if file_type in pst_types:
cmd = "readpst -o '%s' -S '%s'" % (extracted_path,file_path)
else:
cmd = "7z -y -r -o%s x '%s'" % (extracted_path,file_path)
print cmd
args= shlex.split(cmd)
print args
try:
sp = subprocess.Popen(args, shell = False, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
out, err = sp.communicate()
print out, err
ret = sp.returncode
except OSError:
print "Error no %s Message %s" % (OSError.errno,OSError.message)
pass
if ret == 0:
if unlink==True:
os.unlink(file_path)
return "OK!"
else:
return "Failed"
if __name__ == '__main__':
extractRecursive('Path/To/Archives' ,archive_type)
Oui on se demande comment il peut cesser, mais il arrête à cause de cela: à arcExtract: si unlink == Vrai: os.unlink (file_path) qui supprime les archives après un archivage. Récursif est nécessaire Parce qu'il existe des archives, Inside Archives, Imagine tar.gz et tar.bz2, ils doivent tous être extrait de façon récursive. Aussi les fichiers PST contiennent des pièces jointes qui ont des archives, ils doivent tous être extraits. –
Votre architecture suggérée est réalisable. Je vais essayer. Le seul problème est readpst ne pas afficher le chemin du dossier extrait. Je peux le forcer sur l'option -o "Path_To_Extract" mais il doit d'abord vérifier les noms de dossier existants pour éviter toute collision. –
@ V3ss, merci de clarifier pourquoi il s'arrête (ie, dû à la suppression après désarchivage) et de voir que l'itération appropriée (si vous pouvez obtenir les chemins des fichiers extraits) peut en effet supprimer le besoin de récursion (malgré l'archi problème interne, que j'avais déjà envisagé) - bonne chance de faire readpst faire ce dont vous avez besoin (ça sonne comme un problème pour superuser.com ;-). –