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 averti
    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
    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 324
    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 324
    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

  3. #3
    Expert confirm�
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    D�cembre 2008
    Messages
    4 247
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : D�cembre 2008
    Messages : 4 247
    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

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    F�vrier 2006
    Messages
    12 851
    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 851
    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 confirm�
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    D�cembre 2008
    Messages
    4 247
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : D�cembre 2008
    Messages : 4 247
    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:[email protected]
    END:VCARD
    BEGIN:VCARD
    VERSION:3.0
    FN:John Doe
    N:Doe;John;;;
    EMAIL;TYPE=INTERNET:[email protected]
    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

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    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 confirm�
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    D�cembre 2008
    Messages
    4 247
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : D�cembre 2008
    Messages : 4 247
    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

  8. #8
    Expert confirm� Avatar de papajoker
    Homme Profil pro
    D�veloppeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 324
    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 324
    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

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    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 averti
    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
    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 averti
    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
    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 324
    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 324
    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 ?)

  13. #13
    Membre averti
    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
    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