2017-08-11 1 views
0

J'ai un fichier zip téléchargé à partir du site Web. Je voulais faire un script qui renommer le fichier zip et avant de le décompresser, il vérifie le nombre de fichiers qui s'y trouvent et le dézippe.python: erreur de décompression 'aucun fichier ou répertoire'

Le problème est que le fichier zip dans le répertoire, mais il garde me donner erreur « FileNotFoundError: [Errno 2] Aucun fichier ou répertoire: « filename.zip » » Je suppose que cela pourrait être causé par nom de fichier parce que j'utilise ubuntu et quand j'ai téléchargé le fichier, le nom a été brisé parce que ce n'était pas l'anglais. donc je l'ai changé en chiffres (ex: 20176) mais toujours obtenir cette erreur.

mon script chemin signifie chemin absolu.

data_type = '{}{}'.format('201706', '.zip') 
    filename = [i for i in os.listdir('user/directory')] 
    filename.sort(key=lambda ctime: ctime[0]) 
    downloaded = str(filename[0]) 

    old = os.path.join('user/directory', downloaded) 
    new = os.path.join('user/directory', data_type) 
    os.rename(old, new) 

    zip = ZipFile(data_type) 
    archived_files = zip.namelist() 
    amount = len(archived_files) 

Répondre

0

Supposons que le premier nom de fichier dans la liste triée est myfile.txt. Votre code

old = os.path.join('user/directory', downloaded) 
new = os.path.join('user/directory', data_type) 
os.rename(old, new) 

renomme le premier fichier dans la liste des répertoires, utilisateur/répertoire/myfile.txt (non, en raison des considérations qui précèdent, la plus ancienne) à utilisateur/répertoire/201706.zip . La déclaration suivante tente alors d'ouvrir 2010706.zip, ce qui bien sûr n'existe pas. Cela devrait fonctionner si vous essayez

zip = ZipFile(new) 

Malheureusement, il n'y a aucune garantie que le fichier sera en réalité un fichier zip, donc l'opération peut échouer.

D'autres points à considérer, peut-être dans d'autres questions:

Je pense que vous comprenez mal les fonctions de tri: bien que vous semblez vouloir trier la liste des noms de fichiers sur le temps de la création, tout simplement appeler le paramètre d'un lambda ctime de doesn Ne signifie pas que Python comprendra vos besoins. Si seulement les langages de programmation avaient un mode DWIM («fais ce que je veux dire»), la vie serait tellement plus facile!

L'argument key-sort est une fonction que la fonction sort appelle une fois pour chaque valeur à trier, en attendant qu'il revienne une « clé de tri » (qui est une valeur qui représente sa place dans l'ordre requis). Supposons que je prends votre lambda et l'appliquer à un nom de fichier:

In [1]: ruth_lambda = lambda ctime: ctime[0] 

In [2]: ruth_lambda("MY_FILENAME.TXT") 
Out[2]: 'M' 

Vous pouvez voir que vous triez sur le premier caractère du nom de fichier, et je doute que ce soit ce que vous voulez vraiment. Mais nous pouvons y aller plus tard.

Une note rapide sur la mise en forme: il aurait été plus simple d'écrire

data_type = '{}{}'.format(zipfile_name, '.zip') 

comme

data_type = '{}.zip'.format(zipfile_name) 

Enfin, depuis os.listdir renvoie une liste, au lieu de

filename = [i for i in os.listdir('user/directory')] 

il est plus simple à écrire

filename = os.listdir('user/directory') 

bien que le calcul supplémentaire ne nuira pas. En tant que débutant, vous constaterez qu'au fur et à mesure que vous progressez, votre ancien code commence à avoir l'air vraiment maladroit - ne vous inquiétez pas, c'est une expérience commune! Avancez simplement et essayez de ne pas répéter les vieilles erreurs.

+0

J'ai modifié le code. Supprimé certains codes non pertinents et mettre une chaîne au lieu de 'chemin' – ruth