IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

changer l'ordre , os.listdir()


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2020
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2020
    Messages : 12
    Points : 4
    Points
    4
    Par défaut changer l'ordre , os.listdir()
    Bonjour à tous, je rencontre actuellement un problème que je n'arrive pas à résoudre malgrer toute mes recherches. Je cherche à crée un gif moyennant récuperation d'images numérotés , avec la fonction os.listdir(), cela marche très bien à un détail près que les images sont récupérés dans un ordre correspondant non pas à l'ordre naturel mais un ordre arbitraire.
    Alors que je voudrais avoir :

    [image1,image2,image3 etc...], j'ai [image1,image10,image11etc..]



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    import numpy as np
    import matplotlib.pyplot as plt
    import scipy.special as sp
    import os 
    import imageio                                
     
    ----------------------------------------------------------------------------------------------------------------------------------------------......
     
    Dossier_GIF = Dossiercréé
     
    images = []    
     
     
    for file_name in os.listdir(Dossier_GIF):                      ###########ICI########
     
        if file_name.endswith('.png'):                                                     
                file_path = os.path.join(Dossier_GIF, file_name)                  
                images.append(imageio.imread(file_path)) 
     
    imageio.mimsave('{}/GIF.gif'.format(Dossier_GIF), images,fps=0.9)        
     
     
    print("Terminé (2/2) ! Le GIF 2 se trouve dans : " +Dossier_GIF)
    print("Merci !")

  2. #2
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Bonjour

    oui, comme l'indique très clairment la doc, os.listdir() ne garantit aucun ordre (en fait c'est celui de la fonction système très très ... bas niveau qui liste les entrées d'un répertoire, ça dépend donc de l'OS).

    Il va donc falloir que tu boucles, non pas sur os.listdir(), mais sur sorted(os.listdir(), key=...)

    Et comme tes noms d'images élémentaires ne se prêtent pas bien à un tri de numéros/entiers (le nombre de caractères finaux pour le no est variable), tu vas :
    • si tu ne génères pas toi-même ces images élémentaires et leur nom, devoir écrire une fonction "un peu" compliquée pour key
    • si tu génères ces images élémentaires et leur nom, te dépêcher de les recréer avec des noms plus sympathiques, se terminant (avec l'extension) par '_1', '_2', ... '_10', etc... ou '01', '02', ... '10', etc... par exemple et, dans ce cas, tu pourras utiliser une simple fonction lambda comme key


    [EDIT] ooops : avec les noms indiqués, sans les changer, une bête fonction lambda est possible (même début de nom, taille constante)

    lambda name: int(name[len('image'):])
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  3. #3
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    hello,
    regarde cet article en angliche : Sorting for Humans : Natural Sort Order . Il y a du code en python pour faire un tri en ordre naturel.

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par antrax69 Voir le message
    cela marche très bien à un détail près que les images sont récupérés dans un ordre correspondant non pas à l'ordre naturel mais un ordre arbitraire.
    Ce que vous appelez "ordre arbitraire" s'appelle ordre alphabétique et est bien décrit dans l'article mentionné par Jurrasic Pork. Si vous voulez que le chiffre qui est codé dans le nom du fichier soit utilisé pour votre relation d'ordre, il va falloir "trier" avec sort en demandant d'utiliser ces chiffres comme clef.

    note: la solution basique étant de dire que le numéro est un champ de longueur fixe et préfixé par des zéros. Pour numéroter 100000 fichiers, le bout de chaine de caractères pour numéroter sera de longueur fixe. Le premier sera "000001" et non "1". Cela ne garantit pas qu'os.listdir les retournera dans cet ordre (comme mentionné par plxpy), juste qu'on pourra les trier avec un sort "simple".

    Une autre solution est de faire gérer l'ordre par une base de donnée, on incrémente un numéro qui sera associé au nom de fichier qu'on ajoute (pour autant qu'ils soient UNIQUEs). Ce qui permet d'avoir moins de contraintes sur le nommage des fichiers - ils peuvent même être dans des répertoires différents -.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2020
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2020
    Messages : 12
    Points : 4
    Points
    4
    Par défaut Résolu
    Tout d'abord merci pour vos réponse très claire sur le sujet, j'ai réussi à corriger le problème peu après mon post en nommant mes fichier 1000,1001 etc..En effet comme vous l'avez dis je sauvegarde ces même image moi même au sein du programme donc ça marche bien. Ayant essayer avec .sort , sorted, j'avoue ne pas être arriver à grand résultat par manque de compréhension sûrement !

    Merci beaucoup en tous cas !

Discussions similaires

  1. [Thunderbird] changer l'ordre des comptes
    Par Eusebius dans le forum Thunderbird
    Réponses: 2
    Dernier message: 26/07/2006, 09h08
  2. Changer l'ordre ordinal d'une colonne
    Par mictif dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 07/04/2006, 08h30
  3. Réponses: 1
    Dernier message: 29/03/2006, 11h33
  4. Rajout colonne - changer l'ordre des colonnes ?
    Par Coptere dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 13/09/2005, 10h56
  5. changer l'ordre des dates dans table
    Par lordyan dans le forum Requêtes
    Réponses: 11
    Dernier message: 14/01/2005, 11h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo