2017-10-10 2 views
1

J'ai 2 To de données, et je dois décompresser les fichiers pour faire une analyse. Cependant, en raison d'un problème d'espace disque, je ne peux pas décompresser tous les fichiers à la fois. Ce que je pensais, c'est décomposer d'abord deux mille d'entre eux, puis faire mon analyse et la répéter pour le prochain 2000. Comment je pourrais le faire?Dézipper le nombre de fichiers itérativement en utilisant Python

import os, glob 
import zipfile 


root = 'C:\\Users\\X\\*' 
directory = 'C:\\Users\\X' 
extension = ".zip" 
to_save = 'C:\\Users\\X\\to_save' 

#x = os.listdir(path)[:2000] 
for folder in glob.glob(root): 
    if folder.endswith(extension): # check for ".zip" extension 
     try: 
      print(folder) 
      os.chdir(to_save) 
      zipfile.ZipFile(os.path.join(directory, folder)).extractall(os.path.join(directory, os.path.splitext(folder)[0])) 

     except: 
      pass 
+0

Pensez-vous vraiment que c'est un doublon? – edyvedy13

+0

Ce que je dois faire est d'obtenir le premier 2000, donc les fichiers listés entre 1-2000; puis 2001- 4000 – edyvedy13

Répondre

3

Qu'en est-il ?:

import os 
import glob 
import zipfile 

root = 'C:\\Users\\X\\*' 
directory = 'C:\\Users\\X' 
extension = ".zip" 
to_save = 'C:\\Users\\X\\to_save' 

# list comp of all '.zip' folders 
folders = [folder for folder in glob.glob(root) if folder.endswith(extension)] 

# only executes while there are folders remaining to be processed 
while folders: 
    # only grabs the next 2000 folders if there are at least that many 
    if len(folders) >= 2000: 
     temp = folders[:2000] 
    # otherwise gets all the remaining (i.e. 1152 were left) 
    else: 
     temp = folders[:] 

    # list comp that rebuilds with elements not pulled into 'temp' 
    folders = [folder for folder in folders if folder not in temp] 

    # this was all your code, I just swapped 'x' in place of 'folder' 
    for x in temp: 
     try: 
      print(x) 
      os.chdir(to_save) 
      zipfile.ZipFile(os.path.join(directory, x)).extractall(os.path.join(directory, os.path.splitext(x)[0])) 
     except: 
      pass 

Cela fait une liste temporaire de de l'.zip et supprime alors les éléments de la liste initiale. Le seul inconvénient est que folders est modifié et finira par être vide si vous deviez l'utiliser ailleurs.

+0

Merci beaucoup pour votre réponse J'ai trouvé une solution différente, enregistré les chemins de fichiers à csv plutôt que de les enregistrer dans une liste – edyvedy13