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.
J'ai modifié le code. Supprimé certains codes non pertinents et mettre une chaîne au lieu de 'chemin' – ruth