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 :

Concaténer des chaines de caractères pour créer une variable à laquelle on assigne une liste vide


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 82
    Par défaut Concaténer des chaines de caractères pour créer une variable à laquelle on assigne une liste vide
    Bonjour

    Je voudrais automatiser le processus suivant :
    0) j'ai un path de base, mydir = os.join.path(/content','drive','MyDrive','master')
    1) pour chaque sous dossier de 'master', je voudrais créer une liste répertoriant les sous dossiers

    2) utiliser le nom de chaque dossier de cette liste pour créer une liste vide dont le nom de la variable assignée est le nom du dossier + le préfixe ou suffixe "_encod_"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for char in os.listdir(mydir):
      print((char)+'_encod =[]' )
     
     
    ???
    3) pour chaque fichier de ces sous-dossiers, lister son chemin d'accès dans la liste créée à l'étape 2

    4) pour chaque fichier de ces sous-dossiers, appliquer une fonction personnalisée (myfonction(x))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    mydir_arya= os.path.join(mydir, 'sousdossier')
    encod_arya = []
    
    for path in glob.glob(os.path.join(mydir_arya,'*.jpg')):
        enc_arya.append(myfonction(path))
    j'ai du mal a imbriquer ces étapes dans une boucle for, et encore moins a automatiser la création de variables...

    pourriez-vous m'aider svp ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour !

    En général ça :
    créer une liste vide dont le nom de la variable assignée est le nom du dossier + le préfixe ou suffixe "_encod_"
    C'est une mauvaise idée ! Il y a moyen de faire ça, les pros redonneront la solution, mais ce n'est pas conseillé car très souvent ça part d'une mauvaise compréhension de la logique de python.

    Je te conseillerais d'utiliser os.walk :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> for p,d,f in os.walk(os.path.expanduser(r'~\Desktop\TEST')):
    	print(p, d, f)
     
     
    C:\Users\****\Desktop\TEST ['FOLDER_A', 'FOLDER_B'] ['TEST.txt', 'Toto.odg']
    C:\Users\****\Desktop\TEST\FOLDER_A ['__pycache__'] ['a.py']
    C:\Users\****\Desktop\TEST\FOLDER_A\__pycache__ [] ['a.cpython-39.pyc']
    C:\Users\****\Desktop\TEST\FOLDER_B [] ['b.py']
    Pourquoi avoir besoin de créer une variable 'nommé' à chaque fois ?
    Tu peux stocker ces listes dans un dictionnaire par ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> dico = {}
    >>> for p,d,f in os.walk(os.path.expanduser(r'~\Desktop\TEST')):
    	for file in f:
    		dico.setdefault(os.path.basename(p),[]).append(os.path.join(p,file))
    En même temps tu peux appeler ta fonction et la mettre dans la liste si réel besoin...

    A+
    Dernière modification par Invité ; 02/12/2021 à 00h27.

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 836
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Rrradassse Voir le message
    2) utiliser le nom de chaque dossier de cette liste pour créer une liste vide dont le nom de la variable assignée est le nom du dossier + le préfixe ou suffixe "_encod_"
    LeNarvalo a raison. Un nom de variable ne dépend pas du contenu de ladite variable mais du type de contenu. Si je dois stocker le nombre 5 dans une variable, je ne vais pas nommer ma variable "nombre_5" mais "nombre", ou peut-être plus précisément "nombre_de_livres" ou "nombre_en_stock". De même ton dossier initial tu l'as stocké dans la variable "myDir" (mon directory) parce que cette variable était destinée à stocker "un dossier en général" et non "le dossier master".

    Tu cherches à régler de façon bien maladroite un souci qui se règle de façon très naturelle par les tableaux justement faits pour ça. Tu veux gérer n dossiers, (ou n fichiers) tu dois utiliser un tableau de dossiers (ou de fichiers). Ou comme l'a dit LeNarvalo un dictionnaire (qui n'est qu'un tableau un peu particulier). Ensuite tu pourras boucler dessus pour effectuer un traitement codé une seule fois. Et non pas générer n variables au nom tous différents que tu devras ensuiite traiter n fois avec n lignes de code.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 82
    Par défaut
    Bonjour,

    Merci pour vos réponses.

    Je ne suis pas sure de comprendre, du coup je vais expliciter mon besoin plus en détail :
    J'ai 200 personnes, 200 dossier nommés chacun avec le nom de la personne . 4 à 10 photos par personne.
    Je souhaite récupérer ces photos sur python pour les encoder, et les stocker chacune dans une clef qui aura le nom de la personne et donc du dossier dont les photos sont tirées), afin ensuite de développer un modele de reconnaissance faciale.
    Je peux éventuellement supprimer le dossier intermédiaire et mettre toutes les photos dans un grand dossier en nommant les photos nom_01.jpg ou 01_nom.jpg mais dans ce cas il faudra que je récupère la partie gauche (ou droite) de la photo pour nommer la clef de chaque personne avec son nom, afin de pouvoir récupérer ce nom lors de l'identification sur la photo inconnue ...

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    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 752
    Par défaut
    Salut,

    Si c'est une personne par clef (USB?), il va falloir changer de clef... dans l'opération.

    Après une arborescence a 2 niveaux (personne/photos), c'est traiter chaque répertoire (personne) l'un après l'autre (pour "bouger" les photos)... sans oublier le changement de clef.

    Qui dit 2 niveaux, dit doubles itérations... et c'est ce qu'on sait faire après avoir suivi un minimum de tuto: qu'est ce qui vous bloque?

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

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 82
    Par défaut
    heu... non, Clef de dictionnaire, je n'ai jamais parlé d'USB ha ha, j'essaie de travailler avec Python pas avec des ports usb .... et je ne veux pas bouger les photos. Je veux les read, encoding, face_recognition, vectorize, et calculer la distance euclydienne entre chaque vecteur un a un pour faire ma reconnaissance faciale. Mais je n'arrive pas à faire la boucle qui ouvre un dossier, load les photos une a une, les transforme en vecteur et surtout crée une variable (clef) qui porte le nom du dossier (automatiquement) et qui prend la valeur du vecteur... J'arrive a faire ma reconnaissance faciale pour une liste de personnes quand je les encode a la main, mais pas en boucle, et pas si je ne crée pas a la main mes clefs...

    merci pour vos réponses

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 836
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Rrradassse Voir le message
    Mais je n'arrive pas à faire la boucle qui ouvre un dossier, load les photos une a une, les transforme en vecteur et surtout crée une variable (clef) qui porte le nom du dossier (automatiquement) et qui prend la valeur du vecteur...
    Ah là ça va mieux.
    Pour afficher (de là traiter) tous les fichiers d'un dossier: for fic in os.listdir(dossier): print(fic). Il faut faire attention, le nom du fichier sera celui vu depuis le dossier en question. Si par exemple le dossier "xxx" contient un fichier "toto", tu verras "toto" et non pas "xxx/toto".
    Pour vérifier le type "fichier" d'un fichier os.path.isfile(fichier) (parce qu'un dossier ne contient pas que des fichiers)
    Pour lire un fichier en binaire (donc sans présumer donc de la nature de son contenu): with open(fichier, "rb") as fp: data=fp.read().
    Le reste n'est que du traitement de string. Je te conseillerais d'écrire une fonction faite pour traiter "un" dossier ce qui est permettra déjà de la tester jusqu'à ce qu'elle soit ok pour ensuite l'appeler facilement pour tous les dossiers photos que tu as à traiter.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    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 752
    Par défaut
    Citation Envoyé par Rrradassse Voir le message
    surtout crée une variable (clef) qui porte le nom du dossier (automatiquement) et qui prend la valeur du vecteur...
    Le nom d'un répertoire est une chaîne de caractères qui peut être utilisé comme clef d'un dictionnaire.
    note: quand on parle de photos et de personnes, on n'est plus au niveau réalisation python avec éventuellement un dictionnaire et ses clefs/valeurs.

    Pour le reste, dans tous les tutos vous avez un chapitre sur les fichiers et sans doute sur les dictionnaires... Il y a même tout un chapitre de la FAQ sur les fichiers.

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

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 836
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Rrradassse Voir le message
    Citation Envoyé par Rrradassse Voir le message
    2) utiliser le nom de chaque dossier de cette liste pour créer une liste vide dont le nom de la variable assignée est le nom du dossier + le préfixe ou suffixe "_encod_"
    Je ne suis pas sure de comprendre, du coup je vais expliciter mon besoin plus en détail :
    J'ai 200 personnes, 200 dossier nommés chacun avec le nom de la personne . 4 à 10 photos par personne.
    Je souhaite récupérer ces photos sur python pour les encoder, et les stocker chacune dans une clef qui aura le nom de la personne et donc du dossier dont les photos sont tirées), afin ensuite de développer un modele de reconnaissance faciale.
    Je peux éventuellement supprimer le dossier intermédiaire et mettre toutes les photos dans un grand dossier en nommant les photos nom_01.jpg ou 01_nom.jpg mais dans ce cas il faudra que je récupère la partie gauche (ou droite) de la photo pour nommer la clef de chaque personne avec son nom, afin de pouvoir récupérer ce nom lors de l'identification sur la photo inconnue ...
    Tu avais pourtant bien clairement parlé de "nom de variable" dans ton premier post. Dans tous les langages informatiques du monde, une variable c'est un symbole qui associe un nom (identifiant) à une valeur. Exemple toto=5 ou myDir=os.path.join(...). Dans chaque cas, le nom de la variable c'est ce qui est situé avant le "=" ("toto" et "myDir" dans mes deux exemples). Il restera invariant dans tout le programme (contrairement à son contenu qui, lui, peut varier d'où le nom de "variable").

    Pour le reste, ce que tu veux faire reste assez flou. Qu'entends-tu par "encoder" ?
    De ce que je lis, tu as 200 dossiers sur ton disque et tu veux les copier sur clef USB, te suffit de plugguer ta clef USB sur ton ordinateur et faire un copier/coller de tes 200 dossiers. Python n'aura rien à faire la dedans. Quant à utiliser "une clef par dossier" (déjà que j'ai 6 clefs USB et que j'en égare régulièrement 5, gérer 200 clefs...)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Rrradassse Voir le message
    Bonjour,

    Merci pour vos réponses.

    Je ne suis pas sure de comprendre, du coup je vais expliciter mon besoin plus en détail :
    J'ai 200 personnes, 200 dossier nommés chacun avec le nom de la personne . 4 à 10 photos par personne.
    Je souhaite récupérer ces photos sur python pour les encoder, et les stocker chacune dans une clef qui aura le nom de la personne et donc du dossier dont les photos sont tirées), afin ensuite de développer un modele de reconnaissance faciale.
    Je peux éventuellement supprimer le dossier intermédiaire et mettre toutes les photos dans un grand dossier en nommant les photos nom_01.jpg ou 01_nom.jpg mais dans ce cas il faudra que je récupère la partie gauche (ou droite) de la photo pour nommer la clef de chaque personne avec son nom, afin de pouvoir récupérer ce nom lors de l'identification sur la photo inconnue ...
    Eh bien ce que j'ai posté devrait faire l'affaire...
    Le code stock les chemins des fichiers photos présentes dans chaque dossier de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dico = {'M. Dupont': ['chemin_photo1.jpg','chemin_photo2.jpg'], 'M. Durant':['chemin_photo1.jpg','chemin_photo2.jpg','chemin_photo3.jpg','chemin_photo4.jpg'], ...}
    Ensuite tu n'as plus qu'à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for nom in dico.keys():
        paths = dico[nom]
        for path in paths:
            mafonction_de_traitement_dimage(nom, path)
    C'est bien ça que tu veux ?

Discussions similaires

  1. [Débutant] Extration et Concaténation des chaines de caractères en vb
    Par Gbedjanhoungbo Jean dans le forum VB.NET
    Réponses: 5
    Dernier message: 04/08/2020, 21h15
  2. Réponses: 5
    Dernier message: 27/03/2018, 17h20
  3. Réponses: 11
    Dernier message: 03/07/2017, 14h45
  4. Rechercher des chaines de caractères précises dans une page
    Par Amour312 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 07/12/2016, 10h24
  5. Réponses: 1
    Dernier message: 30/01/2013, 20h15

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