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

  1. #21
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par dedalios Voir le message
    Sauf erreur tant que le commit n'est pas validé , le instruction reste en mémoireet n'impace pas la base donc faut-il dans ce cas utiliser le roolback!!! avant le close de base .
    Selon le livre apprednre a programme avec python3 , sur les pages associer à la gestion de base de donnée nottament sqllite il y dit est répéter " le modification apportées au curseur se passent en mémoire viv et de ce fait rien n'est enregitré définitivemernt tant que vous n'exécutez pas l'instruction de commit ,vous pouvez annuler toutes les modifications apporté depuis le précédent commit() en refermant la conecion à l'aide de l'instruction Base.close().
    ce qui pose question sur le roolback...
    Ce n'est pas ce que j'ai dit. Voilà comment je fais, avec l'exemple de ton code:

    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
    LaBase ="nombase2.sq3" 
    Base = sqlite3.connect(LaBase)
     
    .....
     
                try:
                    curseur.execute(instruction)
                    Base.commit()
                except sqlite3.Error as e:
                    print("Problème"+ " :" +   e.args[0]  + " sur commande /n"++ instructiuon)  
                    Base.rollback()
     
    ...
     
    Base.close()
    En faisant comme ça, si le commit échoue mais a déjà commencé à faire des modifs, rollback démonte les modifs partiellement appliquées pour retrouver la situation du commit précédent.

    Je fais comme ça depuis longtemps avec des bases complexes (plus de 10 tables et plusieurs contraintes de clés étrangères), et je n'ai jamais eu le moindre problème d'intégrité de la base.

    On peut aussi éviter d'écrire l'instruction avec ".rollback()" en utilisant le manager de contexte (avec with...) comme c'est décrit dans la doc de Python: le rollback est alors implicite à la fin du bloc en cas d'erreur.

    Je reconnais que ça concerne surtout des problèmes plus complexes (avec plusieurs ".execute"), mais c'est intéressant de prendre de bonnes habitudes...

  2. #22
    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 Solution faite sur la base de la des réflexions Tyrtamos
    Voici le code creer sur la base des réflexions Tyrtamos


    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
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    # coding: utf-8  
    '''
    Created on 23 mars 2018
     
    @author: 
    '''
    import csv
    import sqlite3
    import sys
    import datetime
    import csv
    import os
    import encodings
    from unidecode import unidecode
    from codecs import open
     
    def convertie_date(src):
        if src =='NULL':
            valid_date = None
        else:
            alpha_aaaa = int(src[0:4]) 
            alpha_mm =   int(src[4:6]) 
            alpha_jj =  int(src[6:8]) 
            try :
                valid_date = datetime.date(alpha_aaaa,alpha_mm,alpha_jj) 
                return valid_date
            except ValueError:
                print('%s Date invalide !' % src)
                return None
    pass  
     
    def EstceNull(src):
        if src =='NULL':
            return  None
        else:
            return src
     
    def Estce_nombreNull(src):
        if src =='NULL':
            return  None
        else:
            return int(src)    
     
    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 = True
        # 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 
     
     
    class vls_actes(object):
     
        def __init__(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
     
        def table_sqllite(self,Base):
            creer_table  = """CREATE TABLE vsl_actes(
                ACT_CODE TEXT(255) NOT NULL,
                ACT_LIBELLE TEXT(255),
                CONSTRAINT actes_pk PRIMARY KEY(ACT_CODE)
            );
            """ 
     
            detruire_table  = """DROP TABLE IF EXISTS vsl_actes;"""
     
            curseur =  Base.cursor() # appel au curseur
     
            # supprimer table existante
            if(detruire_table !=""):
                try:
                    curseur.execute(detruire_table)  
                except sqlite3.Error as e:
                    print("Problème"+ " :" +   e.args[0]  + " sur commande /n"+ detruire_table )
                    Base.rollback()
                else:
                  Base.commit()    
     
            pass       
            if(creer_table !=""):
                print("creer base")
                try:
                    curseur.execute(creer_table)
                except sqlite3.Error as e:
                    print("Problème"+ " :" +   e.args[0]  + " sur commande /n"++ creer_table )  
                    Base.rollback()
                else:
                  Base.commit()    
            pass
     
        def insertion_sqllite(self,Base):
     
            curseur = Base.cursor() # appel au curseur
            data=[self.ACT_CODE,self.ACT_LIBELLE]
     
            if(self.ACT_CODE == '9BFC1'):
                print(data)     
            rq = """       INSERT INTO vsl_actes
                            (ACT_CODE, ACT_LIBELLE)
                               VALUES(?, ?);"""
     
            try:
                curseur.execute(rq,data)
     
            except sqlite3.Error as e:
                print("Problème"+ " :" +   e.args[0]  + " sur commande d'insertion /n" )  
                print(rq)
                Base.rollback()
            else: 
                Base.commit()  
     
    def actes(nomfichier,Base):
     
        file = open(nomfichier,  encoding='utf8')
        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):
                    nouvel_acte = vls_actes(row)  
     
                    if(i==2): # Suppprsseion de la table pr�c�dente  si besion 
                        # cr�ation de la nouvelle table 
                        nouvel_acte.table_sqllite(Base)
                    # insertion de donn�es
                    nouvel_acte.insertion_sqllite(Base)
     
                    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')
        except OSError:
                print("Problème d'access au fichier :" + nomfichier)
        finally:
            #
            # Fermeture du fichier source
            #
            file.close()     
     
     
     
    if __name__ == '__main__':
        # Enregistre ce dialecte aupr�s du module csv
        encodage ="utf-8"
        LaBase ="nombase2.sq3" 
        Base = sqlite3.connect(LaBase)
        csv.register_dialect('excel-fr', ExcelFr())
     
        actes("actes.csv" , Base)
     
        Base.close()

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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