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 :

Lire un fichier .vcf et .ics en python en sélectionnant certaines infos


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2022
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2022
    Messages : 12
    Points : 11
    Points
    11
    Par défaut Lire un fichier .vcf et .ics en python en sélectionnant certaines infos
    Voici ma fonction le problème c'est que j'aimerais récupérer que certaines informations dans mon fichier .vcf ici. Par exemple, voici le début de mon fichier .vcf :
    BEGIN:VCARD
    VERSION:3.0
    Noe;John;;;
    FN:John Doe

    j'aimerais récupérer : 3.0, Doe, John Doe

    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
     
    def infoVcard(fichierVirtualCard):
     
        """
        La fonction infoVcard récupère un fichier en .vcf, cette virtual card va etre ouverte et on va recuperer quelques informations contenu à l'interieur
     
        @Paramètres
        ----------
        fichierVirtualCard :
            nom du fichier à traiter
        
        @Return
        ------
        On affiche le contenu du fichier
     
        """
     
     
        print("----------------------------------------------------------------------------------------")
     
        #ouverture du fichier en lecture ('r' pour read)
     
        with open(fichierVirtualCard, 'r') as fc:
            liste = ''.join(fc.readlines())
     
        donnee = liste.split("END:VCARD")
     
        print(donnee)
     
        taille=len(donnee) 
     
        listeTemp = []
        listefinale = []
     
        for i in donnee :
     
            #i.split("\n")
            print(i) #on affiche les données du tableau
     
            if ("item" in i) :
                None
            elif ("X-ABUID" in i) :
                None
            else :
                print("test")
     
     
        print(listeTemp)
        print(listefinale)
     
        print("----------------------------------------------------------------------------------------")

  2. #2
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 102
    Points : 4 448
    Points
    4 448
    Par défaut
    bonjour

    je ne comprends pas ta question puisque ta demande n'a rien de particulier par rapport à ton code existant.
    Tu utilises déjà 36 fois split() par forcément bien, il te suffit de l'utiliser une fois de plus split(":") (et je suppose qu'il manque quelque part un split("\n") )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    contact=[]
    for chaque ligne du fichier
       datas = ligne.split(":")
       si datas[0] == "Nom":
            contact.add(datas[1])
    return contact
    $moi= ( !== ) ? : ;

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 952
    Points : 9 281
    Points
    9 281
    Par défaut
    Hello,
    il existe une bibliothèque qui sait lire les fichiers vcf (vobject) : Voir ici. Sinon on peut faire cela aussi avec les expressions régulières (module re).
    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
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Pas besoin de parenthèses au if => if "item" in i fonctionne ; ou plutôt est syntaxiquement correcte (car question "fonctionnement" je n'ai pas tellement vu de string "item" dans ton exemple vcf ).
    Ensuite l'instruction neutre c'est pass et non None.

    Citation Envoyé par RyanChe Voir le message
    j'aimerais récupérer : 3.0, Doe, John Doe
    Pour "3.0" tu cherches une ligne commençant par "VERSION:". Pour "Doe" c'est la ligne "N:" et pour "John Doe" c'est la ligne "FN:". Mais bien évidemment la phase "je stocke toutes les lignes sous forme de grosse string unique" n'aidera pas vraiment ensuite à identifier les "lignes commençant par ..."

    Et je ne vois pas de référence à un fichier "ics" comme indiqué dans ton titre.
    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]

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 952
    Points : 9 281
    Points
    9 281
    Par défaut
    Hello,
    Citation Envoyé par Sve@r Voir le message
    Bonjour
    Et je ne vois pas de référence à un fichier "ics" comme indiqué dans ton titre.
    les fichiers ics sont des fichiers en format VCalendar que sait lire aussi vobject.
    Voici un exemple pour les lire des données VCard er VCalendar en utilisant vobject.
    1 - Données de test (format vcf et ics) :
    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
    test_vcard_information = r"""BEGIN:VCARD
    VERSION:3.0
    FN:Alain Tairieur
    N:Tairieur;Alain;;
    EMAIL;TYPE=INTERNET:foobar1@foo.bar.com
    END:VCARD
    BEGIN:VCARD
    VERSION:3.0
    FN:John Doe
    N:Doe;John;;;
    EMAIL;TYPE=INTERNET:foobar2@foo.bar.com
    END:VCARD
    """
    test_calendar_information = r"""BEGIN:VCALENDAR
    PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN
    VERSION:2.0
    BEGIN:VTIMEZONE
    TZID:America/Toronto
    BEGIN:DAYLIGHT
    TZOFFSETFROM:-0500
    TZOFFSETTO:-0400
    TZNAME:EDT
    DTSTART:19700308T020000
    RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3
    END:DAYLIGHT
    BEGIN:STANDARD
    TZOFFSETFROM:-0400
    TZOFFSETTO:-0500
    TZNAME:EST
    DTSTART:19701101T020000
    RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11
    END:STANDARD
    END:VTIMEZONE
    BEGIN:VEVENT
    CREATED:20170104T022518Z
    LAST-MODIFIED:20170104T022643Z
    DTSTAMP:20170104T022643Z
    UID:3fab09d6-59bb-430b-8b21-56c9636871e2
    SUMMARY:Write a chapter
    CATEGORIES:Projects
    DTSTART;TZID=America/Toronto:20170105T140000
    DTEND;TZID=America/Toronto:20170105T150000
    TRANSP:OPAQUE
    X-MOZ-GENERATION:2
    LOCATION:At home
    DESCRIPTION:One day I will be a great writer but I have to start somewhere...
    SEQUENCE:1
    END:VEVENT
    BEGIN:VEVENT
    CREATED:20170104T022346Z
    LAST-MODIFIED:20170104T022654Z
    DTSTAMP:20170104T022654Z
    UID:b304f46a-f533-4aa4-8ee1-3b59649dedfa
    SUMMARY:See a movie
    CATEGORIES:Entertainment
    DTSTART;TZID=America/Toronto:20170103T110000
    DTEND;TZID=America/Toronto:20170103T140000
    TRANSP:OPAQUE
    X-MOZ-GENERATION:4
    LOCATION:Somewhere over the rainbow
    DESCRIPTION:The Wizard of Oz is movie I haven't seen in a long time.\n\nWe
      should schedule a time to see it
    SEQUENCE:1
    END:VEVENT
    END:VCALENDAR"""
    2 - Code pour lire les données de test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import vobject
    print("===========  VCARD ============")
    for vcard in vobject.readComponents(test_vcard_information):
        print(vcard.version.value,'-',vcard.n.value.family,'-',vcard.fn.value)
        print("==========================================")
     
    print("===========  VCALENDAR ============")
    vcalendar = vobject.readOne(test_calendar_information)
    for vevent in vcalendar.vevent_list:
        print(vevent.summary.value)
        print("================================")
    Résultat :
    =========== VCARD ============
    3.0 - Tairieur - Alain Tairieur
    ==========================================
    3.0 - Doe - John Doe
    ==========================================
    =========== VCALENDAR ============
    Write a chapter
    ================================
    See a movie
    ================================
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Points : 1 876
    Points
    1 876
    Par défaut
    Bonjour,

    Je plussoie le cochon, puisque vous exploitez un type de fichier dont le format est standard et répandu, il vaut mieux utiliser une lib existante déjà exploitée par plein d'autres programmeurs, et la rajouter dans votre requirements.txt.
    Cette manière de faire est primitive et pas efficace.

    Dans certains cas il arrive qu'on veut parser un fichier à la main, mais alors on le lit ligne par ligne (pas tout d'un coup), et on évalue chaque ligne soit en fonction du début ou avec un regex. Il n'y a pas besoin de charger la totalité du fichier en mémoire, surtout quand le fichier peut être très volumineux.

    Donc vous pourriez lire le fichier ligne par ligne en boucle avec readline (à ne pas confondre avec readlines). Et sortir de la boucle une fois que toutes les infos ont été trouvées, pas besoin d'aller jusqu'au bout.

    Malheureusement votre code lit l'entièreté du fichier et renvoie une liste de lignes avec readlines. Vous auriez pu malgré tout faire une boucle sur cette liste. Mais au lieu de ça, vous la reconvertissez en string en faisant un join dessus, ça n'a aucun sens. Autant faire fc.read, ça revient au même mais sans le gaspillage de ressources.

    Ce qui est positif c'est l'usage du context manager (with). Tous ces splits sont inutiles.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        with open(fichierVirtualCard, 'r') as fc:
            liste = ''.join(fc.readlines())

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 952
    Points : 9 281
    Points
    9 281
    Par défaut
    Hello,
    Citation Envoyé par binarygirl Voir le message
    puisque vous exploitez un type de fichier dont le format est standard et répandu, il vaut mieux utiliser une lib existante déjà exploitée par plein d'autres programmeurs, et la rajouter dans votre requirements.txt.
    Cette manière de faire est primitive et pas efficace.
    pourquoi ? Si le but n'est pas d'apprendre mais de trouver une fonction qui réalise ce que l'on veut faire, cela ne sert à rien de "réinventer la roue". On ne fera certainement pas mieux que quelqu'un qui a déjà planché sur le sujet et qui a amélioré son code au fil du temps.
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  8. #8
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 102
    Points : 4 448
    Points
    4 448
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    cela ne sert à rien de "réinventer la roue". On ne fera certainement pas mieux que quelqu'un qui a déjà planché sur le sujet et qui a amélioré son code au fil du temps.
    pas vraiment d'accord…
    sur pypi il y a plus de 400 000 librairies (hors standard python), croire que tout est très bon (...) et de plus:

    - je n'ai pas envie de chercher et tester des modules pendant des heures pour un besoin ponctuel (suis pas un chercheur mais un codeur)
    - pas envie que mes utilisateurs aient besoin d'installer 20 paquets pour un petit script
    - si je peux l'écrire en 20..50 lignes, je ne me pose même pas la question (utiliser une usine à gaz pour enfoncer un clou ?)

    ici, je ne connais pas le besoin réel. ok, une librairie peut être bien meilleure, mais cela dépend que du cahier des charges
    Dans le cas de cette lib, un code qui n'a pas bougé depuis 5 ans avec 50 issues ouvertes et un paquet de PR en attente (comme: "update for python 3.10" ok, c'est que pour icalendar), cela ne me donne pas envie de l'utiliser
    $moi= ( !== ) ? : ;

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Points : 1 876
    Points
    1 876
    Par défaut
    Citation Envoyé par papajoker Voir le message
    pas vraiment d'accord…
    sur pypi il y a plus de 400 000 librairies (hors standard python), croire que tout est très bon (...)
    Je confirme, sans parler des librairies malicieuses

    Citation Envoyé par papajoker Voir le message
    - je n'ai pas envie de chercher et tester des modules pendant des heures pour un besoin ponctuel (suis pas un chercheur mais un codeur)
    Il n'y a pas besoin de chercher des heures, là c'est un besoin très courant et il y a des libs répandues pour cela, comme icalendar aussi.
    Pour chaque type de tâche, il y a en général une lib ou quelques libs qui viennent immédiatement à l'esprit des programmeurs.
    Ce sont des libs ultra-connues et non "exotiques", que beaucoup de développeurs connaissent déjà. Et donc le code produit est facile à appréhender, parce que justement beaucoup de développeurs connaissent la lib, et qu'il y a de la doc disponible que vous n'aurez pas à rédiger (point à ne pas négliger).

    Citation Envoyé par papajoker Voir le message
    - si je peux l'écrire en 20..50 lignes, je ne me pose même pas la question (utiliser une usine à gaz pour enfoncer un clou ?)
    Bien d'accord, mais dans le cas présent est-ce utile? Oui pour la valeur éducative, non si le but est d'avoir quelque chose d'opérationnel et raisonnablement fiable rapidement. Je sais déjà à quoi ressemble un fichier .ics mais je n'ai pas forcément envie d'étudier les détails du standard. Mais si je ne l'étudie pas, alors le code risque d'être buggé parce que j'ai ignoré certains détails ou cas de figure.

    Citation Envoyé par papajoker Voir le message
    Dans le cas de cette lib, un code qui n'a pas bougé depuis 5 ans avec 50 issues ouvertes et un paquet de PR en attente (comme: "update for python 3.10" ok, c'est que pour icalendar), cela ne me donne pas envie de l'utiliser
    Ce sont des points pertinents. Il ne faut pas utiliser n'importe quoi. D'un autre côté il y a pas mal de libs populaires qui ne bougent pas beaucoup, parce que par exemple le format du fichier à parser n'a pas évolué. Alors, à part du bugfix, il n'y a pas forcément grand-chose à ajouter. Ce n'est pas forcément alarmant.
    Les gros projets aussi ont beaucoup de PR ou d'issues open. Mais il y a aussi beaucoup d'issues résolues.

    En revanche, si ça commence à foirer avec les versions récentes de Python alors oui vous avez parfaitement raison. Il vaut peut-être mieux opter pour une lib mieux maintenue.

    Si vraiment on veut le faire à sa sauce, alors c'est peut-être utile de regarder comment la lib est faite, et prendre juste ce dont on a besoin, et l'améliorer le cas échéant.
    Il faut aussi regarder comment font les autres, on apprend vraiment beaucoup ainsi.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2022
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2022
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Bonsoir j'ai utilisé votre réponse car je l'ai trouvée sympa et simple. Juste est ce qu'on peut parcourir le fichier avec cette solution pour afficher tout son contenu ? J'arrive à afficher certaines info que je sélectionne mais j'aimerais quand même savoir si je peux tout afficher au cas ou. Merci !

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2022
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2022
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    Hello,

    pourquoi ? Si le but n'est pas d'apprendre mais de trouver une fonction qui réalise ce que l'on veut faire, cela ne sert à rien de "réinventer la roue". On ne fera certainement pas mieux que quelqu'un qui a déjà planché sur le sujet et qui a amélioré son code au fil du temps.
    Ami calmant, J.P
    c'est à vous que je parle désolé je galère encore avec le site... (pour le message juste au-dessus)

  12. #12
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 102
    Points : 4 448
    Points
    4 448
    Par défaut
    Citation Envoyé par RyanChe Voir le message
    pour afficher tout son contenu ?
    Comme toutes les librairies, il faut lire la doc pour l'utiliser (prettyPrint si un print n'est pas suffisant ?)
    $moi= ( !== ) ? : ;

  13. #13
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2022
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2022
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par papajoker Voir le message
    Comme toutes les librairies, il faut lire la doc pour l'utiliser (prettyPrint si un print n'est pas suffisant ?)
    Le pprint ne fonctionne pas :'( mais je vais essayer d'explorer la librairie

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

Discussions similaires

  1. lire un fichier.sql dans un textbox en python
    Par anasstopog dans le forum Général Python
    Réponses: 1
    Dernier message: 07/06/2013, 13h09
  2. Lire et modifier fichier *.vcf
    Par cincap dans le forum Débuter
    Réponses: 12
    Dernier message: 06/10/2011, 10h33
  3. lire des fichiers .mat avec python
    Par diallokoula dans le forum Calcul scientifique
    Réponses: 4
    Dernier message: 14/01/2011, 13h25
  4. Lire un fichier XML avec Python
    Par eyquem dans le forum Général Python
    Réponses: 2
    Dernier message: 19/12/2007, 13h54
  5. Lire des fichiers vcf (VCard 2.1)
    Par pobrouwers dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 28/04/2007, 10h57

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