2017-08-19 2 views
0

J'essaie de décompresser & copier des fichiers dans quelques sous-répertoires vers un répertoire de destination. Voici mon code.comment copier et décompresser des fichiers dans le répertoire en python

import zipfile,fnmatch,os 

rootPath = r"C:\\Temp\\Test\\source" 
pattern = '*.zip' 
for root, dirs, files in os.walk(rootPath): 
    for filename in fnmatch.filter(files, pattern): 
     zip_ref = zipfile.ZipFile(os.path.join(root, filename)) 
     zip_ref.extractall(os.path.join("C:\\Temp\\Test\\dest")) 

Comme vous pouvez le voir, je l'ai tous les fichiers ouvert la fermeture éclair dans le répertoire source et les copier dans le répertoire dest (ination). Le résultat final attendu devrait être décompressé & copiés les fichiers TXT dans le répertoire dest. (Seulement txt fichiers, no directories)

Mon code a bien fonctionné jusqu'à ce que je trouve la structure du répertoire source (s'il vous plaît se référer au commentaire ci-dessous)

La plupart des sous-répertoires dans le répertoire source ressemblent à [subdir1] et fonctionnent donc parfaitement avec mon code. Mais il y a quelques exceptions comme [subdir2] où le fichier zip contient non seulement un fichier txt mais un répertoire le contenant ... Voici à quoi ressemble le répertoire dest avec le code actuel.

+--- [dest] 
    | 
    +--- [subdir2] 
    |  | 
    |  +--- file2.txt 
    | 
    +--- file1.txt 
    | 

Toute idée de faire il n'y a que décompressé & copiés les fichiers TXT dans le répertoire dest? J'ai d'abord envisagé de copier les fichiers zip, puis de les décompresser dans le répertoire dest, mais je n'ai pas encore trouvé de solution .... Toute aide serait appréciée!

Répondre

0

Votre problème réside dans cette ligne de code:

zip_ref.extractall(os.path.join("C:\\Temp\\Test\\dest")) 

Vous n'avez pas besoin d'utiliser os.path.join, car il ajoute le nom de sous-dossier source. Vous pouvez simplement utiliser ceci:

zip_ref.extractall("C:\\Temp\\Test\\dest") 

EDIT:

os.path.join est redondant, à l'exclusion mais il ne résout pas votre problème.

Le problème est que vous ne pouvez pas appeler os.walk sur les fichiers compressés. Une solution pour cela (bien que je pense qu'il existe une méthode plus efficace) est de déplacer tous les fichiers dans le répertoire racine après qu'ils ont été extraits.

import os 
import shutil 
import fnmatch 

def gen_find(filepat,top): 
    for path, dirlist, filelist in os.walk(top): 
     for name in fnmatch.filter(filelist,filepat): 
      yield os.path.join(path,name) 



if __name__ == '__main__': 
    src = 'C:\\Temp\\Test\\dest' 

    filesToMove = gen_find("*.txt",src) 
    for name in filesToMove: 
     shutil.move(name, src) 
+0

J'ai essayé avec votre suggestion, mais le résultat semble toujours le même :( – Sophia

+0

rejoindre 1 partie de chemin donne la même partie du chemin. Pas très clair, mais les deux lignes font la même chose. –

+1

je pense qu'il est bc le sous-dossier lui-même (contenant un fichier txt) a été dézippé ... – Sophia