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 :

Problème traitement chaînes de caractère pour metadata. Problème split(), strip() [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2018
    Messages : 34
    Par défaut Problème traitement chaînes de caractère pour metadata. Problème split(), strip()
    Bonjour, j'ai trouvé un code sur le web qui utilise ExifTool et le module subprocess, pour récolter les metadata d'une video.
    Le code fait ensuite un léger traitement de chaînes de caractères pour rendre le tout bien plus lisible.
    Cependant le script ne fonctionnement pas correctement et je ne sais pas trop comment régler le problème.

    En gros le split() coupe en deux au niveau du ":" qui sépare la valeur , du descriptif. Mais s'il y a ensuite encore des ":" ils sont supprimer avec ce qui suit, et le problème et là.
    Par exemple pour {'Duration': '0'} 21; on devrai avoir en réalité {'Duration': '0:03:19'} 21.

    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
     
    import subprocess
     
    input_file = "C:/Users/Y/Documents/[AMV]_The_Diary_of_Jane.mp4"
    exe = "C:/Users/Y/Documents/exiftool.exe"
     
    process = subprocess.Popen([exe, input_file], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True)
    metadata = list()
     
    for output in process.stdout: 
    	info = dict()
    	line = output.strip().split(":")
    	info[line[0].strip()] = line[1].strip()
    	metadata.append(info)
     
    i = 1
    for e in metadata:
        print(e,i)
        i+=1
    J'ai le résultat suivant:
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    {'ExifTool Version Number': '11.87'} 1
    {'ExifTool Version Number': '11.87'} 1
    {'File Name': '[AMV]_The_Diary_of_Jane.mp4'} 2
    {'Directory': 'C'} 3
    {'File Size': '39 MB'} 4
    {'File Modification Date/Time': '2018'} 5
    {'File Access Date/Time': '2020'} 6
    {'File Creation Date/Time': '2020'} 7
    {'File Permissions': 'rw-rw-rw-'} 8
    {'File Type': 'MP4'} 9
    {'File Type Extension': 'mp4'} 10
    {'MIME Type': 'video/mp4'} 11
    {'Major Brand': 'MP4  Base Media v1 [IS0 14496-12'} 12
    {'Minor Version': '0.2.0'} 13
    {'Compatible Brands': 'isom, iso2, avc1, mp41'} 14
    {'Media Data Size': '40786874'} 15
    {'Media Data Offset': '48'} 16
    {'Movie Header Version': '0'} 17
    {'Create Date': '0000'} 18
    {'Modify Date': '0000'} 19
    {'Time Scale': '1000'} 20
    {'Duration': '0'} 21
    {'Preferred Rate': '1'} 22
    {'Preferred Volume': '100.00%'} 23
    {'Preview Time': '0 s'} 24
    {'Preview Duration': '0 s'} 25
    {'Poster Time': '0 s'} 26
    {'Selection Time': '0 s'} 27
    {'Selection Duration': '0 s'} 28
    {'Current Time': '0 s'} 29
    {'Next Track ID': '3'} 30
    {'Track Header Version': '0'} 31
    {'Track Create Date': '0000'} 32
    {'Track Modify Date': '0000'} 33
    {'Track ID': '1'} 34
    {'Track Duration': '0'} 35
    {'Track Layer': '0'} 36
    {'Track Volume': '0.00%'} 37
    {'Image Width': '1280'} 38
    {'Image Height': '720'} 39
    {'Graphics Mode': 'srcCopy'} 40
    {'Op Color': '0 0 0'} 41
    {'Compressor ID': 'avc1'} 42
    {'Source Image Width': '1280'} 43
    {'Source Image Height': '720'} 44
    {'X Resolution': '72'} 45
    {'Y Resolution': '72'} 46
    {'Bit Depth': '24'} 47
    {'Video Frame Rate': '25.005'} 48
    {'Matrix Structure': '1 0 0 0 1 0 0 0 1'} 49
    {'Media Header Version': '0'} 50
    {'Media Create Date': '0000'} 51
    {'Media Modify Date': '0000'} 52
    {'Media Time Scale': '44100'} 53
    {'Media Duration': '0'} 54
    {'Media Language Code': 'und'} 55
    {'Handler Description': 'SoundHandler'} 56
    {'Balance': '0'} 57
    {'Audio Format': 'mp4a'} 58
    {'Audio Channels': '2'} 59
    {'Audio Bits Per Sample': '16'} 60
    {'Audio Sample Rate': '44100'} 61
    {'Handler Type': 'Metadata'} 62
    {'Handler Vendor ID': 'Apple'} 63
    {'Encoder': 'Lavf56.40.101'} 64
    {'Image Size': '1280x720'} 65
    {'Megapixels': '0.922'} 66
    {'Avg Bitrate': '1.64 Mbps'} 67
    {'Rotation': '0'} 68
    Pourriez m'expliquer le problème pour que je le comprenne et puisse résoudre l'erreur (de moi-même si possible, mieux pour apprendre)?
    Cordialement

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

    Citation Envoyé par Kyusuke Voir le message
    Pourriez m'expliquer le problème pour que je le comprenne et puisse résoudre l'erreur (de moi-même si possible, mieux pour apprendre)?
    Le soucis est dans ces 2 lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	line = output.strip().split(":")
    	info[line[0].strip()] = line[1].strip()
    La première instruction découpe output suivant les ':' pour fabriquer la liste line qui pourra contenir 0 ou plusieurs éléments suivant le nombre de ':' trouvés.
    Et l'instruction suivante fabrique une entrée dans le dictionnaire ayant pour clef le premier élément de cette liste et pour valeur le 2nd ignorant le reste (s'il y 'en a).

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

  3. #3
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2018
    Messages : 34
    Par défaut
    Merci beaucoup pour la réponse.

    J'ai globalement compris le problème, mais malgré de multiples tentatives et essaie, je ne trouve pas comment résoudre le problème.
    J'ai essayé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    line = output.strip().split(":")
    info[line[0].strip()] = line[2:]
    Ce qui me donne ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {'Duration': ['03', '19']} 21
    C'est mieux, mais pas encore ça. Pourrais-je avoir un petit coup de main. Le traitement de chaînes de caractères c'est pas mon fort.
    Cordialement


    EDIT:
    Avec: info[line[0].strip()] = line[1:] et ensuite une manipulation pour transformer les valeur de la liste en string, cela devrait le faire?

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

    Citation Envoyé par Kyusuke Voir le message
    C'est mieux, mais pas encore ça. Pourrais-je avoir un petit coup de main. Le traitement de chaînes de caractères c'est pas mon fort.
    Si vous voulez prendre une chaine de caractères avec un ou plusieurs ':' et la découper en 2 après le premier ":", vous pouvez bien sûr la découper aveuglément suivant tous les ':' qui existent. Puis comme vous ne vouliez que le premier ':', il faut reconstruire la deuxième partie avec ':'.join(...).

    Mais vous pouvez aussi regarder si votre couteau ne saurait pas s'arrêter au premier ':' trouvé. Regarder, c'est utilisez le "help" en ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> help(str.split)
    Help on method_descriptor:
     
    split(...)
        S.split(sep=None, maxsplit=-1) -> list of strings
     
        Return a list of the words in S, using sep as the
        delimiter string.  If maxsplit is given, at most maxsplit
        splits are done. If sep is not specified or is None, any
        whitespace string is a separator and empty strings are
        removed from the result.
    ou ouvrir la documentation (traduite en français).

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

  5. #5
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2018
    Messages : 34
    Par défaut
    Ceci fonctionne très bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    line = output.strip().split(":", maxsplit=1)
    	info[line[0].strip()] = line[1].strip()
    Merci beaucoup pour le temps passer à me répondre et ces bons conseils. L'utilisation maxsplit=1 règle très bien le problème.
    Désolé d'avoir pris votre temps pour un problème qui aurai était réglé rapidement si j'avais poussé mes recherche sur split() plus loin, surtout vers la doc officiel.
    -(D'habitude j'y passe pas mal de temps, mais là je n'ai pas eu le réflexe)-


    Merci beaucoup pour le temps que vous m'avez accorder. Problème résolu.
    Cordialement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Traitement chaîne de caractère
    Par lecter85 dans le forum Excel
    Réponses: 6
    Dernier message: 18/07/2012, 12h08
  2. Réponses: 2
    Dernier message: 22/12/2011, 18h19
  3. traitement chaîne de caractères et insertion colonnes
    Par keely dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 13/04/2010, 13h49
  4. Problème de chaîne de caractères pour popup
    Par roxxxy dans le forum Langage
    Réponses: 6
    Dernier message: 19/03/2007, 18h18
  5. [XSL] Traitement chaîne de caractères
    Par VolaiL dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 29/03/2006, 16h55

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