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 :

notion de class et lecture de csv


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut notion de class et lecture de csv
    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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    # coding: utf-8  
    '''
    Created on 23 mars 2018
     
    @author: dedalios
    '''
    import csv
    import sqlite3
    #
    class vls_actes(object):
     
        def __init__(self,ACT_CODE,ACT_LIBELLE):
             self.ACT_CODE = ACT_CODE
             self.ACT_LIBELLE =ACT_LIBELLE
     
     
        def charger_csv(self,liste):
            self.ACT_CODE = liste[0]
            self.ACT_LIBELLE =liste[1]
     
        def __str__(self):
            resultat = "Act_Code :" +  self.ACT_CODE + "\n"
            resultat += "ACT_LIBELLE:" + self.ACT_LIBELLE      
            return  resultat
     
    class Creation_table(object):
     
        """ Structure des tables  """
     
        def __init__(self):
            self.dbNAME ='vsl.sq3'  
            self.nomrepertoire =None
            self.Base =None
     
        def creer_table(self):
            self.dbNAME =self.nomrepertoire+'/'  +self.dbNAME
            self.Base =sqlite3.connect(self.dbNAME)  # ouverture DB
            curseur = self.Base.cursor() # appel au curseur
     
            vls_actes = """   CREATE TABLE vls_actes(
                ACT_CODE String(255),
                ACT_LIBELLE String(255),
                CONSTRAINT actes_pk PRIMARY KEY(ACT_CODE)
            ); """
     
            if(vls_actes!=""):
                try:
                    curseur.execute(vls_actes)
                    self.Base.commit()
                except:
                    print("Problème vls_actes")
     
     
     
    #
    class ExcelFr(csv.excel):
        # Séparateur de champ
        delimiter = ";"
        # Séparateur de ''chaîne''
        quotechar = None
        # Gestion du séparateur dans les ''chaînes''
        escapechar = None
        doublequote = None
        # Fin de ligne
        lineterminator = "\r\n"
        # Ajout automatique du séparateur de chaîne (pour ''writer'')
        quoting = csv.QUOTE_NONE
        # Ne pas ignorer les espaces entre le délimiteur de chaîne
        # et le texte
        skipinitialspace = False 
     
    if __name__ == '__main__':
        # Enregistre ce dialecte auprès du module csv
    #    
        i=0 # iterateur du nombre de ligne lu
        csv.register_dialect('excel-fr', ExcelFr())
        fname = "actes.csv"
        file = open(fname, "r")
    #
    # Ouverture du fichier source.
    #
    # D'après la documentation, le mode ''b'' est
    # *obligatoire* sur les plate-formes où il est
    # significatif. Dans la pratique, il est conseillé
    # de toujours le mettre.
    #
        try:
            #
            # Création du ''lecteur'' CSV.
            #
            fichier_lu = csv.reader(file, 'excel-fr')
     
            for row in fichier_lu:
                i+=1
                # supression de la igne N° 1 du fichier porteur de l'entete
                if(i>1):
                    nouvel_acte= vls_actes(row[0],row[1])
                    print(nouvel_acte)
     
        finally:
            #
            # Fermeture du fichier source
            #
            file.close()

    mon problème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                nouvel_acte= vls_actes.charger_csv(row)
    l'exécution renvoi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       nouvel_acte= vls_actes.charger_csv(row)
    TypeError: charger_csv() missing 1 required positional argument: 'liste'
    la finalite effectué la convertion du csv en base sqllite.
    Il existe effectivement des outils de convertion csv -> sqllite mais voila cela suppose que le fichier d'origine respecte les régles de codification ce qui n'est pas toujours cas , donc je préfére vérifier les données,
    faire des convertions sur divers donnes de type numérique , sur des zones définie comme des date ...



    Autre point si comme le recommande les informations la lecture de fichier csv on utilise la lecture "rb"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     file = open(fname, "rb")
    cette commande retourne une erreur
    for row in fichier_lu:
    _csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)

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

    Citation Envoyé par dedalios Voir le message
    mon problème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                nouvel_acte= vls_actes.charger_csv(row)
    l'exécution renvoi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       nouvel_acte= vls_actes.charger_csv(row)
    TypeError: charger_csv() missing 1 required positional argument: 'liste'
    vls_actes.charger_csv(row) exécute la fonction "charger_csv". Cette fonction là attend bien 2 arguments: self et liste. Ca fonctionnerait en écrivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    obj = vls_actes()
    vls_actes.charger_csv(obj, row)
    ou:
    Profitez en pour revoir votre tuto préféré aux chapitres des "class".

    Citation Envoyé par dedalios Voir le message
    Autre point si comme le recommande les informations la lecture de fichier csv on utilise la lecture "rb"
    C'était le cas pour Python2, avec Python3 c'est différent.
    Et en général, lorsqu'à l'usage une bibliothèque ne se comporte pas comme attendu, ouvrir la documentation pour vérifier qu'on l'utilise correctement avant de poster...

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

  3. #3
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut Et pourtant
    Donc tu prospose d'utliser ce codage pour l'appel de l'objet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    obj = vls_actes()
    vls_actes.charger_csv(obj, row)


    La class

    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
    class vls_actes(object):
     
        def __init__(self,ACT_CODE,ACT_LIBELLE):
     
            if(ACT_CODE == "NULL"):
                self.ACT_CODE = None
            else:
               self.ACT_CODE = ACT_CODE
     
            if(ACT_LIBELLE == "NULL"):
                self.ACT_LIBELLE = None
            else:
               self.ACT_LIBELLE = ACT_LIBELLE
     
     
        def charger_csv(self,liste):
     
            if(liste[0] == "NULL"):
                self.ACT_CODE = None
            else:
               self.ACT_CODE = liste[0]
     
            if(liste[0] == "NULL"):
                self.ACT_LIBELLE = None
            else:
               self.ACT_LIBELLE = liste[1]
     
     
        def __str__(self):
            resultat = "Act_Code :" +  self.ACT_CODE + "\n"
            resultat += "ACT_LIBELLE:" + self.ACT_LIBELLE   
            return  resultat

    et donc l'appel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                    nouvel_acte =vls_actes()
                    nouvel_acte.charger_csv(row)
    Problème le paramètrage de l'objet attend 2 paramètres ar defaut dans l'init et donc renvoi ceci

    nouvel_acte =vls_actes()
    TypeError: __init__() missing 2 required positional arguments: 'ACT_CODE' and 'ACT_LIBELLE'

    je vias garder la syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nouvel_acte = vls_actes(row[0],row[1])
    aprés tous elle est cohérente par rapport a ce que j'ai pu lire sur les concepte d'objet

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Citation Envoyé par dedalios Voir le message
    Donc tu prospose d'utliser ce codage pour l'appel de l'objet
    Pas du tout, je vous proposais de réfléchir au code que vous écrivez.

    "vls_actes" est le nom de la classe, pas celui d'une instance de la classe.
    Donc le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    obj = vls_actes()
    vls_actes.charger_csv(obj, row)
    crée une instance, l'assigne à "obj" et appelle la fonction vls_actes.charger_csv avec en paramètres obj, row.
    Si on veut appeler la méthode associée à l'objet on écrira obj.charger_csv(row) (qui est l'écriture plus conventionnelle que vous trouvez dans les tutos.

    Citation Envoyé par dedalios Voir le message
    Problème le paramètrage de l'objet attend 2 paramètres ar defaut dans l'init et donc renvoi ceci

    nouvel_acte =vls_actes()
    TypeError: __init__() missing 2 required positional arguments: 'ACT_CODE' and 'ACT_LIBELLE'
    Ben oui, j'essaie de vous faire comprendre qu'on instancie un objet avant d'appeler une méthode associée et non de corriger votre code pour que vous ayez juste à le recopier...

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

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    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 830
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par dedalios Voir le message
    Donc tu prospose d'utliser ce codage pour l'appel de l'objet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    obj = vls_actes()
    vls_actes.charger_csv(obj, row)
    Ce n'est pas une proposition, c'est simplement une conséquence de ton objet. La méthode charger_cs() est une méthode non statique. Donc elle doit fatalement s'appliquer à une instance de l'objet "vls_actes". Donc il te faut d'abord créer cette instance pour pouvoir ensuite utiliser sa méthode charger_cs().
    On aurait pu écrire en condensé vls_actes.charger_csv(vls_actes(), row) mais là on perd alors l'instance de l'objet créé ce qui peut gêner ensuite (parce qu'à mon avis on en aura encore besoin).

    Citation Envoyé par dedalios Voir le message
    Problème le paramètrage de l'objet attend 2 paramètres ar defaut dans l'init et donc renvoi ceci
    Ah ben oui, l'exemple de wiztricks n'était qu'un exemple générique de 1) je crée une instance de l'objet dont j'ai besoin pour 2) pouvoir alors appeler une méthode de cette instance. Bien évidemment, il te faut l'adapter à ton propre objet. Si, pour créer une instance, ton objet a besoin de 2 paramètres, alors bien évidemment que tu dois lui passer ces deux paramètres à la création.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    obj = vls_actes(truc1, truc2)
    vls_actes.charger_csv(obj, row)
    Citation Envoyé par dedalios Voir le message
    je vias garder la syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nouvel_acte = vls_actes(row[0],row[1])
    aprés tous elle est cohérente par rapport a ce que j'ai pu lire sur les concepte d'objet
    Oui, si "row[0]" et "row[1]" correspondent à ce qui est attendu à la création, ça marche. Tout ceci n'a d'ailleurs rien à voir avec le problème originel qui était "comment appeler la méthode charger_cs() d'un objet" et où la réponse de wiztricks est "d'abord créer l'objet" et où la mienne se complète en "d'abord créer correctement l'objet".
    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]

  6. #6
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut
    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
     
     
    def EstceNull(src):
        if src =='NULL':
            return  None
        else:
            return src
     
     
    class vls_actes(object):
     
        def __init__(self,ACT_CODE,ACT_LIBELLE):
            self.ACT_CODE = EstceNull(ACT_CODE)
            self.ACT_LIBELLE =   EstceNull(ACT_LIBELLE)
     
         def charger_csv(self,liste):
            self.ACT_CODE = EstceNull( liste[0]);
            self.ACT_LIBELLE =   EstceNull(liste[1]);
     
     
     
     
        def __str__(self):
            resultat = "Act_Code : " +  str(self.ACT_CODE) + "\n"
            resultat += "ACT_LIBELLE: " + str(self.ACT_LIBELLE )  
            return  resultat

    Je veux en fait pouvoir faire appel au constructeur de 2 façons différentes

    Soit en lui passant en paramètre de l'objet séparement , soit en lui donnant le contenu du fichier csv.
    La class créer est creer sur la base du fichier csv.


    Si j'appel l'objet vls_actes()

    je vais donc

    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
    class ExcelFr(csv.excel):
        # Séparateur de champ
        delimiter = ";"
        # Séparateur de ''chaîne''
        quotechar = None
        # Gestion du séparateur dans les ''chaînes''
        escapechar = None
        doublequote = None
        # Fin de ligne
        lineterminator = "\r\n"
        # Ajout automatique du séparateur de chaîne (pour ''writer'')
        quoting = csv.QUOTE_NONE
        # Ne pas ignorer les espaces entre le délimiteur de chaîne
        # et le texte
        skipinitialspace = False 
     
     
     
    if __name__ == '__main__':
        # Enregistre ce dialecte auprès du module csv
    #    
     
        csv.register_dialect('excel-fr', ExcelFr())
     
     
        # -----------------
        fname = "actes.csv"
        file = open(fname, "r")
        i=0 # indeteur de ligne du fichier pour ne pas traiter l'entete 
        #
        # Ouverture du fichier source.
        #
        try:
            #
            # Création du ''lecteur'' CSV.
            #
            fichier_lu = csv.reader(file, 'excel-fr')
            max_long_ACT_CODE = 0
            max_long_ACT_LIBELLE = 0
            for row in fichier_lu:
                i+=1
                if(i>1):
    permiere soultion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nouvel_acte = vls_actes(row[0],row[1])
    deuxieme solution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     nouvel_acte = vls_actes(None,None)     
                    nouvel_acte.charger_csv(row)
    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
     
                    print(nouvel_acte)
     
                    if(max_long_ACT_CODE < len(nouvel_acte.ACT_CODE)):
                         max_long_ACT_CODE = len(nouvel_acte.ACT_CODE)
     
                    if(max_long_ACT_LIBELLE < len(nouvel_acte.ACT_LIBELLE)):
                         max_long_ACT_LIBELLE = len(nouvel_acte.ACT_LIBELLE)
     
     
            print(max_long_ACT_CODE, end='\n' )
            print(max_long_ACT_LIBELLE , end='\n')
     
        finally:
            #
            # Fermeture du fichier source
            #
            file.close()

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Citation Envoyé par dedalios Voir le message
    Je veux en fait pouvoir faire appel au constructeur de 2 façons différentes

    Soit en lui passant en paramètre de l'objet séparement , soit en lui donnant le contenu du fichier csv.
    Construire l'objet avec ou sans paramètres pose question sur l'utilité des attributs qui seront crées en fonction de ces paramètres. Si l'objet peut vivre sans, ils ne servent à rien et s'il ne peut s'en passer vous allez les initialiser comment?

    Si vous aviez passé plus de temps sur les fonctions, vous sauriez qu'il existe des paramètre par défaut: def __init__(self, ACT_CODE=None, ACT_LIBELLE=None).

    Mais ce n'est pas cette sucrerie syntaxique qui donnera du sens à une information qui n'existe pas.

    - 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. lecture fichier .csv
    Par wiss20000 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 06/06/2007, 20h48
  2. Réponses: 7
    Dernier message: 06/02/2007, 13h27
  3. Réponses: 5
    Dernier message: 08/01/2007, 14h05
  4. classe de lecture d'images
    Par suckthewindow dans le forum Bibliothèques
    Réponses: 7
    Dernier message: 16/09/2005, 16h06
  5. Notions de classe abstraite
    Par smag dans le forum C++
    Réponses: 11
    Dernier message: 12/06/2005, 02h04

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