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

Réseau/Web Python Discussion :

Parse aléatoire avec python 3.4


Sujet :

Réseau/Web Python

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 162
    Points : 66
    Points
    66
    Par défaut Parse aléatoire avec python 3.4
    Bonjour, je suis nouveau dans le langage python et pour ce que j'ai besoin de faire j'ai acheté le livre Data Wrangling with pyhton chez o'reilly.
    Tous le livre est codé en python2.7 mais j'essaye de le faire en 3.4. Peut être est-ce inutile ? Enfin bon.
    Mon problème est le suivant j'essaie de parser un fichier xml, avant de me lancer sur un site en ligne.
    Mon soucis est le 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
     
    #! /usr/bin/python3.4
    # -*-coding:Utf-8-*-
     
    from xml.etree import ElementTree as ET
     
    tree = ET.parse('data-text.xml')
    root = tree.getroot()
    data = root.find('Data')
     
    all_data = []
     
    for observation in data:
      record = {}
      for item in observation:
        lookup_key = list(item.attrib.keys())[0]
        print(lookup_key)
    Or quand j'execute ce code je n'ai pas toujours le même résultat. Des fois j'ai ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Code
    Code
    Code
    Code
    Code
    Code
    Numeric
    Code
    Code
    Code
    Code
    Code
    Code
    Numeric...
    et d'autre :
    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
     
    Category
    Category
    Category
    Category
    Category
    Category
    Numeric
    Category
    Category
    Category
    Category
    Category
    Category
    Numeric...
    Et ceux sans la moindre logique, ce n'est pas une fois l'un une fois l'autre.
    Quelqu'un peut-il m'aider à y voir plus clair.
    merci

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Sans voir le contenu de ton xml de test, il faut deviner.

    Ceci item.attrib.keys() signifie qu'il s'agit d'un dictionnaire, or les dictionnaires ne sont pas ordonnés il est donc normal que la première clé de la liste soit différente à chaque lecture.

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Lorsqu'on construit un dictionnaire Python, l'ordre des clefs est indéfini (sauf à utiliser un OrderedDict, mais les attributs d'un élément XML ne sont pas ordonnés).
    Vous devriez arriver à reproduire ce même problème avec un script contenant juste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print ({ 'A': None, 'B': None, 'C': None, 'D': None })
    non seulement, çà ne va pas s'afficher comme çà mais çà va bouger d'une exécution à l'autre (lancement de l'interpréteur).


    Dans la pratique, il faut "ranger" les clefs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lookup_key = sorted(item.attrib.keys())[0]
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 162
    Points : 66
    Points
    66
    Par défaut
    Alors originellement la ligne 16 à pour code en python 2.7
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lookup_key=item.attrib.keys()[0]
    Qui elle ne renvoie qu'un seul résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Category
    Category
    Category
    Category
    Category
    Category
    Numeric
    Category
    Category
    Category
    Category
    Category
    Category
    Numeric...
    Mais cette écriture n'est plus autorisée avec 3.4.
    En ce qui concerne le fichier annalysé en voici une partie
    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
    <Observation FactID="13233138" Published="true" Dataset="CYCU" EffectiveDate="2016-05-13" EndDate="2900-12-31">
    <Dim Category="COUNTRY" Code="SWZ"/>
    <Dim Category="GHO" Code="WHOSIS_000002"/>
    <Dim Category="YEAR" Code="2015"/>
    <Dim Category="REGION" Code="AFR"/>
    <Dim Category="SEX" Code="BTSX"/>
    <Dim Category="PUBLISHSTATE" Code="PUBLISHED"/>
    <Value Numeric="50.86177">
    <Display>50.9</Display>
    </Value>
    </Observation>
    <Observation FactID="13233140" Published="true" Dataset="CYCU" EffectiveDate="2016-05-13" EndDate="2900-12-31">
    <Dim Category="GHO" Code="WHOSIS_000002"/>
    <Dim Category="REGION" Code="EMR"/>
    <Dim Category="YEAR" Code="2015"/>
    <Dim Category="SEX" Code="BTSX"/>
    <Dim Category="COUNTRY" Code="SYR"/>
    <Dim Category="PUBLISHSTATE" Code="PUBLISHED"/>
    <Value Numeric="56.08191">
    <Display>56.1</Display>
    </Value>
    </Observation>
    l'intégralité peut être vu ici : lien

    Et donc en ce qui concerne python2.7 vs python3.4, vaut-il mieux apprendre le 2.7 ou directement passé au 3.4
    Merci

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par Erlen Voir le message
    Alors originellement la ligne 16 à pour code en python 2.7
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lookup_key=item.attrib.keys()[0]
    Du point de vue XML, écrire <Dim Category="COUNTRY" Code="SWZ"/> ou <Dim Code="SWZ" Category="COUNTRY"/> sont équivalents.
    Et côté Python, l'ordre des clefs retourné par dict.keys() (V2) ou list(dict.keys()) (V3) n'est pas prédictible.
    Il eut été plus correct (côté tuto) d'écrire sorted(item.attrib.keys())[0]. Écriture qui a le mérite de fonctionner avec liste ou itérable et donc avec Python2 et Python3.

    Ce qu'ajoute Python3, c'est que la fonction de hash utilisée tient compte d'un nombre aléatoire: l'ordre des clefs change d'une exécution à l'autre. Ce comportement peut être contrôlé avec la définition de la variable d'environnement PYTHONHASHSEED. Comme cette fonctionnalité a été ajoutée pour pallier des problème de sécurité: vous devriez avoir le même comportement avec les dernières versions de Python 2.7 (mais je n'ai pas vérifié si c'était le cas).

    Citation Envoyé par Erlen Voir le message
    Et donc en ce qui concerne python2.7 vs python3.4, vaut-il mieux apprendre le 2.7 ou directement passé au 3.4
    Et pourquoi pas la version 3.5? (qui est la dernière?).
    Pour moi, débuter avec Python, version2 ou version3 est équivalent... mais si vous avez un tuto. V2 et que vous utilisez Python3, vous allez perdre du temps à interpréter les différences sans avoir encore acquis les bases pour comprendre (comme la discussion actuelle): utilisez la version de Python de votre tuto ou changez de tuto mais restez cohérent.

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

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 162
    Points : 66
    Points
    66
    Par défaut
    Et côté Python, l'ordre des clefs retourné par dict.keys() (V2) ou list(dict.keys()) (V3) n'est pas prédictible.
    Oui mais là ça n'est pas dict.keys() ici c'est dict.attrib.keys()[] le attrib n'est pas là pour rien, il a bien une fonction.
    Ensuite je maintiens que quand je fais tourner
    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
    #! /usr/bin/python2.7
    # -*-coding:Utf-8-*-
     
     
    from xml.etree import ElementTree as ET
     
    tree = ET.parse('data-text.xml')
    root = tree.getroot()
    data = root.find('Data')
     
     
    all_data = []
     
    for observation in data:
      record = {}
      for item in observation:
        lookup_key = item.attrib.keys()[0]
        print lookup_key
    J'ai toujours le même résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Category
    Category
    Category
    Category
    Category
    Category
    Numeric
    Category
    Category
    Category
    Category
    Category
    Category
    Numeric
    il y a donc quelque chose de "prédictible"
    Puisque normalement la suite du code c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        if lookup_key == 'Numeric':
          rec_key = 'NUMERIC'
          rec_value = item.attrib['Numeric']
        else:
          rec_key = item.attrib[lookup_key]
          rec_value = item.attrib['Code']
     
        record[rec_key] = rec_value
     
      all_data.append(record)
     
    print(all_data)
    Le test est bien fait sur Code l'autre "clé"

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Relisez le message que j'ai posté (et mis à jour suite à un petit soucis réseau).

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

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

Discussions similaires

  1. création de base mySQL avec python
    Par preacher_man dans le forum Bibliothèques tierces
    Réponses: 7
    Dernier message: 23/06/2006, 19h38
  2. Selection aléatoire avec rand
    Par Ruddy16 dans le forum Requêtes
    Réponses: 4
    Dernier message: 06/12/2005, 10h01
  3. Affichage aléatoire avec coéfficients
    Par groupejtt dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 08/11/2005, 22h09
  4. Les 128 derniers bits d'un fichier en ligne avec Python ?
    Par ecocentric dans le forum Réseau/Web
    Réponses: 7
    Dernier message: 26/09/2005, 12h40
  5. [JSP] Parsing XML avec JDOM
    Par benben13 dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 26/08/2005, 17h19

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