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. #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 771
    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 771
    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 771
    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 771
    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 849
    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 849
    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 771
    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 771
    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

  8. #8
    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 conception
    mon probleme est le suivant
    modele 1
    un ensemble de fichier csv avec l''entete des nom de zone dans l'entete , et une version de format csv qui ne permet pas de diff�rentier chaine de texte des zone num�rique.
    je ne dispose pas du modlele de donnee

    modele 2
    un ensemble de fichier plat avec uns structure et un modele de donnees.pour autant le fichier plat ne respecte pas le modele.

    je dois constituer une base comparative des 2 speudo base.



    Pour creer la class de l'un des fichiers 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
    class csv_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
     
    # code en cours de finalisation
        def inserer_base(self,base):
               table ="insert into csv_actes(ACT_CODE,ACT_LIBELLE)  values(  self.ACT_CODE  ,   self.ACT_LIBELLE )"



    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
    class plat_actes(object):
     
        def __init__(self,ACT_CODE,ACT_LIBELLE):
             self.ACT_CODE = ACT_CODE
             self.ACT_LIBELLE =ACT_LIBELLE
     
     
        def charger_csv(self,src):
            self.ACT_CODE = src[0:5]
            self.ACT_LIBELLE =src[5:101]
     
        def __str__(self):
            resultat = "Act_Code :" +  self.ACT_CODE + "\n"
            resultat += "ACT_LIBELLE:" + self.ACT_LIBELLE      
            return  resultat
     
     
     
    # code en cours de finalisation
        def inserer_base(self,base):
               table ="insert into csv_actes(ACT_CODE,ACT_LIBELLE)  values(  self.ACT_CODE  ,   self.ACT_LIBELLE )"



    pour le fichier csv je lis le fichier et je souhaiterais charger les donnees dans la class depuis les donnees du fichier csv qui est une liste
    pour le fichier plat je lis le fichier et je souhaiterais charger les donnees dans la class depuis les donnees du fichier qui une chaine de carract�res

    quelle serait pour vous la meilleur solution de creation de la classe.

    un concepte d'heritage peut etre ?

  9. #9
    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
    Bonjour,

    J'avoue que je ne comprends pas bien le probl�me pos�. Mais comme je fais souvent des conversions sqlite <=> fichiercsv <=> Excel-fran�ais, je peux ajouter quelques trucs.

    Excel fait des conversions automatiques:
    - une chaine ne comportant que des chiffres sera un entier, ou restera une chaine sinon. Cela m'a pos� le probl�me suivant: dans des adresses internationales, le code postal sera chaine ou entier selon sa syntaxe, et ceci dans la m�me colonne!
    - une chaine comportant des chiffres et une virgule sera un nombre flottant, ou restera une chaine sinon. Cela ne va pas bien avec Python qui a des flottants cod�s avec un point d�cimal.

    Et il faut, bien entendu, �tre s�r de l'encodage pratiqu� par Excel dans les lectures/�critures de fichiers csv, selon les versions de Excel et Windows. L'encodage standard de Windows est: "cp1252", et si c'est le cas, il faut pr�voir une conversion d'encodage puisque Python 3 est en unicode et sqlite est en "utf-8".

    On rencontre aussi quelquefois un probl�me de conversion avec le cp1252, lorsqu'un caract�re accentu� est repr�sent� comme 2 caract�res. On peut se d�barrasser du probl�me avec:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    from unicodedata import normalize
    def normalisechaine(ch):
        """Remplace les caractères accentués encodés avec 2 caractères
           en un seul caractère.
           Evite ainsi l'erreur d'encodage en "cp1252"
        """
        return normalize('NFC', ch)
    Pour les lectures/�critures de fichiers csv, le fait de reconna�tre des entiers et des flottants dans des chaines est facile avec les expressions r�guli�res:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # pour reconnaitre un nombre entier dans une chaine
    self.motif_entier = re.compile(r"^[+-]?[0-9]+$")
     
    # pour reconnaitre un 'float' avec point décimal dans une chaine
    self.motif_reel = re.compile(r"^[+-]?(([0-9]+[eE][+-]?[0-9]+)|" + \
    r"([0-9]+\.[0-9]*([eE][+-]?[0-9]+)?)|(\.[0-9]+([eE][+-]?[0-9]+)?))$")
     
    # pour reconnaitre un 'float' avec virgule décimale dans une chaine
    self.motif_reelv = re.compile(r"^[+-]?(([0-9]+[eE][+-]?[0-9]+)|" + \
    r"([0-9]+,[0-9]*([eE][+-]?[0-9]+)?)|(,[0-9]+([eE][+-]?[0-9]+)?))$")
    On int�gre �a dans des questions pour faire les remplacements ou conversions qu'il faut, par exemple:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    if self.motif_entier.match(chaine):
        ...
    On passe de sqlite � Excel et vice-versa avec des "listes de listes" en m�moire, et les �changes avec Excel se font par l'interm�diaire de fichiers csv: il faut donc faire un programme de lecture/�criture de fichiers csv avec les particularit�s qu'on veut (en particulier celles ci-dessus). Et pour ce programme, on peut cr�er un profil particulier pour Excel, par exemple:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Profiltableur(csv.Dialect):
        """Profil de lecture/écriture de fichiers CSV avec Excel"""
        delimiter = ';'
        quotechar = '"'
        doublequote = True
        skipinitialspace = False
        lineterminator = '\r\n'
        quoting = csv.QUOTE_MINIMAL  # autres options: csv.QUOTE_MINIMAL # csv.QUOTE_ALL #csv.QUOTE_NONNUMERIC 
     
    # enregistrement du profil
    csv.register_dialect('profiltableur', Profiltableur())

  10. #10
    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 CSV & Excel
    Merci pour tes informations sur Excel , mais je doute que cela puisse �tre la solution a mon probl�me.

    Je cherche donc � mod�liser 2 base de donn�es que je re�ois pour l'une sous forme de fichiers csv et pour l'autre sous forme de fichier plat.

    Je cherche donc � convertir des donn�es formats csv avec des conversions de donn�es qui d�passe les notions de num�rique et d'alphanum�rique.
    Exemple pour une valeur nulle dans un champ j�ai en claire NULL.
    De conversion de date ... de d�coupage de donn�e ...

    Je cherche � convertir des donn�es formats des fichier plat en base de donn�es et de fait j'ai aussi des conversions de donn�e de type date qui ne sont pas transmit sous le m�me format que dans le cas des csv.

    Je cherche donc a construire des class
    x class charg� de trait� les donn�es issus du fichier csv
    y class charg� de trait� les donn�es issus du fichier plat.

    Voici la cr�ation de class de 2 table similaire

    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 csv_actes(object):
     
        def __init__(self,ACT_CODE,ACT_LIBELLE):
             self.ACT_CODE = ACT_CODE
             self.ACT_LIBELLE =ACT_LIBELLE
     
     
        def charger(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
     
    # code en cours de finalisation
        def inserer_base(self,base):
               table ="insert into csv_actes(ACT_CODE,ACT_LIBELLE)  values(  self.ACT_CODE  ,   self.ACT_LIBELLE )"
     
     
    class plat_actes(object):
     
        def __init__(self,ACT_CODE,ACT_LIBELLE):
             self.ACT_CODE = ACT_CODE
             self.ACT_LIBELLE =ACT_LIBELLE
     
     
        def chargert(self,src):
            self.ACT_CODE = src[0:5]
            self.ACT_LIBELLE =src[5:101]
     
        def __str__(self):
            resultat = "Act_Code :" +  self.ACT_CODE + "\n"
            resultat += "ACT_LIBELLE:" + self.ACT_LIBELLE     
            return  resultat
     
     
     
    # code en cours de finalisation
        def inserer_base(self,base):
               table ="insert into csv_actes(ACT_CODE,ACT_LIBELLE)  values(  self.ACT_CODE  ,   self.ACT_LIBELLE )"


    Ma question est purement sur la construction de ces classes
    sur le fait d'int�grer dans la class les fonctions charger et inserer_base (qui ne sont pas terminer dans cette version).
    ou serait il plus pertinent de cr�er un autre modele.

    Dans ce mod�le l'objet construit par la classe peut �tre diff�rent.


    autre id�e

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class csv_actesc(object):
     
        def __init__(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
     
    # code en cours de finalisation
        def inserer_base(self,base):
               table ="insert into csv_actes(ACT_CODE,ACT_LIBELLE)  values(  self.ACT_CODE  ,   self.ACT_LIBELLE )"
    Appel

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
        src= ['0','2']
        newacte = csv_actesc(src)
        print(newacte.ACT_CODE)

  11. #11
    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
    Ce serait bien de donner plut�t des exemples de donn�es avant et apr�s traitement, parce que essayer de deviner ce que tu veux faire en lisant ton code est beaucoup plus compliqu�.

    Par exemple, je ne sais pas ce que tu entends par "fichier plat". Je sais "aplatir" une liste arborescente de profondeur quelconque (liste de listes de listes etc...) pour donner une simple liste de termes, mais je ne sais pas si on parle de la m�me chose...

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

    Citation Envoy� par dedalios Voir le message
    Je cherche donc a construire des class
    x class charg� de trait� les donn�es issus du fichier csv
    y class charg� de trait� les donn�es issus du fichier plat.
    Vous allez devoir comparer des lignes et des colonnes ou des donn�es qui seront � la ligne i et � la colonne j. Le fichier CSV a d�j� ce genre de structure. Pour ce qui est du fichier plat, tout est � faire.

    Dans ce travail l�, les "class" peuvent �tre utiles pour ranger les fonctions qui permettront de transformer en type Python ce qui aura �t� lu... Mais in fine, il faudra construire un tableau (lignes x colonnes), savoir comment le comparer � l'autre et �crire le code qui va avec (qu'il soit ou pas rang� dans des class...).

    Tant que vous n'aurez pas d�fini cela sur le papier (et �ventuellement le pr�senter ici ou ailleurs) les "class" sont un des d�tails d'un code dont on ne sait pas ce qu'il devra faire pour lire et comparer.

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

  13. #13
    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 FIchier PLat
    Bonjour ,

    La base de donn�es reconstituer pour le fichier plat est fait et fonctionne.
    Cle primaire ,FOREIGN KEY .... j'ai le mod�le de donn�e de ce fichier plat donc plus facile a r�aliser

    un exemple similaire � la r�alite du concept de fichier plat

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    000reference     20180312  
    001CLTR          Lettre
    010CCTC1        LTR       CourrierCV001                                                   2018010120180630150
    010CCTC2        LTR       CourrierCV002                                                   2018070199991231025                               
    001CLVR                   Livre
    010CAPY01      LVR        Apprendre à programmer avec PYTHON3                2018010199991231025
    010CAPY02      LVR        Apprendre à programmer avec PYTHON2                2018010199991231025
    010CCPY02      LVR        Apprendre à programmer avec JAVA                      2018010199991231025           
    001CCD                    CD
    001CSD                      Carte SD
    010CSD0001    SD           HOMEWORLD                                                     2018010199991231001     
    999reference
    les class

    • type_000
    • type_001
    • type_010
    • type_999

    source est le contenu d'une lecture ligne par ligne du fichier plat
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    class type_001(objet):
        def __init__(source):
            self.codetype  =  source[0:4]
            self.codemod =  source[4:5]
            self.Cle_primaire =source[5:13]
    lien type_001 et type_010 FOREIGN KEY


    le but de ce processus est de reconstituer des bases de donnees python est la modalite de comparaison seront r�aliser sur la base de donnees .
    t ...

    ce que je cherche n'est pas de faire de comparaison entre les fichiers plats et fichier csv mais de migrer ces donnees en base sqlite postgress ou oracle 12 est d'utiliser la base pour effectuer des comparatifs.

    De toute fa�on qu'en dans le fichier plat une date null est exprimer par 99991231 et et que son cette valeur est code par le terme NULL , difficile de faire descomparaison brute.

    quand le nom du champ est par CTC1 dans le fichier plat est que sur son suppose equivalent csv on a cli001_CTC1 parce que le champ a un sur ajout d'un identifiant complementaire cli001_ ...
    il y a de la retro inge sur le csv pour constituer le modele de donnes en base...

    dans cette histoire ,je dois comparer des choux et de carottes et v�rifier que la salade est mangeable....

  14. #14
    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 nouvelle version
    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
    # coding: utf-8  
    '''
    Created on 23 mars 2018
     
    @author: 
    '''
    import csv
    import sqlite3
    import string
    import sys
    import datetime
    import csv
    import os
     
     
     
    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 = 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 
     
     
    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 String(255),
                ACT_LIBELLE String(255),
                CONSTRAINT actes_pk PRIMARY KEY(ACT_CODE)
            );
            """ 
     
            detruire_table  = """DROP TABLE vsl_actes;"""
     
     
            curseur =  Base.cursor() # appel au curseur
     
            # supprimer table existante
            if(detruire_table !=""):
                try:
                    curseur.execute(detruire_table)
                    curseur.close()
                    Base.commit()
                except:
                    print("Probl�me  " + detruire_table )  
     
            if(creer_table !=""):
                try:
                    curseur.execute(creer_table)
                    curseur.close()
                    Base.commit()
                except sqlite3.Error as e:
                    print("Probl�me  " + creer_table )  
     
     
        def insertion_sqllite(self,Base):
     
     
            curseur = Base.cursor() # appel au curseur
            data=[self.ACT_CODE,self.ACT_LIBELLE]
     
            rq = """       INSERT INTO vsl_actes
                            (ACT_CODE, ACT_LIBELLE)
                               VALUES(?, ?);"""
     
            try:
                curseur.execute(rq,data)
                curseur.close()
                Base.commit()
            except sqlite3.Error as e:
                print("Requete ex�cuter : insertion \n")
                print(rq)
                print( "An error occurred:", e.args[0]   ) 
     
     
     
    def actes(nomfichier,Base):
     
        file = open(nomfichier, "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):
                    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')
     
        finally:
            #
            # Fermeture du fichier source
            #
            file.close()     
     
     
     
    if __name__ == '__main__':
        # Enregistre ce dialecte aupr�s du module csv
    #    
        LaBase ="nombase2.sq3" 
        Base = sqlite3.connect(LaBase)
        csv.register_dialect('excel-fr', ExcelFr())
     
        actes("actes.csv" , Base)
     
        Base.close()



    voici une evolution du code permettant de charge 'une des table'.*
    Je laancer le code une premiere fois sur une base non existant, il me notifie logiquement "Probl�me DROP TABLE vsl_actes;"

    puis je lancer la code une seconde fois et la voici le message


    An error occurred: no such table: vsl_actes
    Requete ex�cuter : insertion

    INSERT INTO vsl_actes
    (ACT_CODE, ACT_LIBELLE)
    VALUES(?, ?);
    An error occurred: no such table: vsl_actes
    Requete ex�cuter : insertion

    INSERT INTO vsl_actes
    (ACT_CODE, ACT_LIBELLE)
    VALUES(?, ?);
    Si je regarde la base la table n'existe pas ?

    Il a effectu� le drop table

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      detruire_table  = """DROP TABLE vsl_actes;"""
      # supprimer table existante
            if(detruire_table !=""):
                try:
                    curseur.execute(detruire_table)
                    curseur.close()
                    Base.commit()
                except:
                    print("Probl�me  " + detruire_table )
    mais �trangement n'a pas retrait� la ligne suivante

    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
      def table_sqllite(self,Base):
            creer_table  = """CREATE TABLE vsl_actes(
                ACT_CODE String(255),
                ACT_LIBELLE String(255),
                CONSTRAINT actes_pk PRIMARY KEY(ACT_CODE)
            );
            """ 
     
            if(creer_table !=""):
                try:
                    curseur.execute(creer_table)
                    curseur.close()
                    Base.commit()
                except sqlite3.Error as e:
                    print("Probl�me  " + creer_table )

    les 2 IF ne sont pas imbrique , il sont au meme niveau?
    je ne monitor par a tord except sqlite3.Error as e: en fait le probl�me est celui-ci "ProgrammingError: Cannot operate on a closed cursor."

    pourquoi ?

  15. #15
    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
    Bonjour,

    Quand on veut supprimer une table, il vaut mieux utiliser l'option "IF EXISTS" (voir ici: https://www.sqlite.org/lang_droptable.html):

    """DROP TABLE IF EXISTS 'matable' """

    Quand on utilise connexion.commit() dans un try, il faut utiliser connexion.rollback() dans le except pour d�faire ce qui avait �t� �ventuellement commenc� avant l'erreur (gestion de transactions). A d�faut, une erreur peut laisser la base dans un �tat anormal.

    Et, � mon avis, clore le curseur avant le commit est une erreur.

    Pour savoir ce qui existe comme table dans la base sqlite � un moment donn�, on peut faire une extraction avec le script SQL suivant:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    SELECT name FROM sqlite_master
    WHERE type='table' AND sql!=''
    On peut aussi lire le contenu de la base de donn�es avec un produit comme sqliteexpert (http://www.sqliteexpert.com/). La version "personnal" gratuite suffit pour cet usage.

  16. #16
    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
    Citation Envoy� par tyrtamos Voir le message
    Bonjour,

    Quand on veut supprimer une table, il vaut mieux utiliser l'option "IF EXISTS" (voir ici: https://www.sqlite.org/lang_droptable.html):

    """DROP TABLE IF EXISTS 'matable' """

    Quand on utilise connexion.commit() dans un try, il faut utiliser connexion.rollback() dans le except pour d�faire ce qui avait �t� �ventuellement commenc� avant l'erreur (gestion de transactions). A d�faut, une erreur peut laisser la base dans un �tat anormal.

    Et, � mon avis, clore le curseur avant le commit est une erreur.

    Pour savoir ce qui existe comme table dans la base sqlite � un moment donn�, on peut faire une extraction avec le script SQL suivant:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    SELECT name FROM sqlite_master
    WHERE type='table' AND sql!=''
    On peut aussi lire le contenu de la base de donn�es avec un produit comme sqliteexpert (http://www.sqliteexpert.com/). La version "personnal" gratuite suffit pour cet usage.

    le IF IF EXISTS n'est pas un pas un syntaxe qui existe sur les base que j'utilise habituellement (Oracle et DB400)

  17. #17
    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 voici la correction
    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 string
    import sys
    import datetime
    import csv
    import os
     
     
     
    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 = 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 
     
     
    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 String(255),
                ACT_LIBELLE String(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 )
                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 )  
                else:
                  Base.commit()    
            pass
     
        def insertion_sqllite(self,Base):
     
     
            curseur = Base.cursor() # appel au curseur
            data=[self.ACT_CODE,self.ACT_LIBELLE]
     
            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)
     
            else:
                  Base.commit()  
     
     
     
    def actes(nomfichier,Base):
     
        file = open(nomfichier, "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):
                    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')
     
        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()

    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...

    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(instructiuon)
                except sqlite3.Error as e:
                    print("Problème"+ " :" +   e.args[0]  + " sur commande /n"++ instructiuon)  
                else:
                  Base.commit()  
     
    ...
     
        Base.close()


    petit probl�me

    le fichier de base en UTF-8.
    j'utiliser pour ma part DBEAVEr pour l'acc�s � la base .
    et celle-ci est note comme base en utf-8.

    Si je ne fais pas d' �tre python utliser par defaut UTF-8

    Hors lorsque j'affiche la table avec dbeaver les carect�re accentu�s sont recod�

    exemple Frais réels pour Frais r�els dans le fichier

    AUtre chose g�nante la r�interpr�ation des donn�es du fichier csv . il va me falloir tout forme via str(xx)

    extrait du csv
    1A241;1A241
    1E011;1E011
    1E012;1E012
    1E013;1E013
    int�rpr�tation en base
    1A241 1A241
    100000000000 100000000000
    1000000000000 1000000000000
    10000000000000 10000000000000

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

    �a serait bien d'avoir un probl�me par discussion...
    Ne serait ce que pour essayer de vous concentrer un peu sur chaque probl�me avant de poster.

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

  19. #19
    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
    Citation Envoy� par wiztricks Voir le message
    Salut,

    �a serait bien d'avoir un probl�me par discussion...
    Ne serait ce que pour essayer de vous concentrer un peu sur chaque probl�me avant de poster.

    - W
    il est vrai que pour moi c'est le meme projet avec ces erreurs.

    comme par exemple la lecture dans le fichier csv de cette information

    qui g�n�re bien dans la cr�ation du sql
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
    INSERT INTO vsl_actes
    (ACT_CODE, ACT_LIBELLE)
    VALUES("1E011", "1E011");
    dbeaver affche
    ACT_CODE ACT_LIBELLE
    100000000000 100000000000

    Lancer cette commande d'insert via dbeaver g�n�re la m�me speudo interpr�tation est-ce l'interpr�tation de DBEAVER ???
    il semble que non j'ai le me�me probl�me si j'ouvre la table creer avec SQLITEexpert
    l'editeur de cette outil affiche 䡶
    select * from vsl_actes
    where ACT_CODE ="1E011"

    SQLITEexpert
    ACT_CODE ACT_LIBELLE
    100000000000 100000000000




    et sur les caract�res accentu�
    INSERT INTO vsl_actes
    (ACT_CODE, ACT_LIBELLE)
    VALUES('AZ', 'Frais réels')
    donc le probl�me en l'encodage du fichier text

  20. #20
    Expert �minent
    Homme Profil pro
    Architecte technique retrait�
    Inscrit en
    Juin 2008
    Messages
    21 771
    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 771
    Par d�faut
    Citation Envoy� par dedalios Voir le message
    il est vrai que pour moi c'est le meme projet avec ces erreurs.
    Certes mais les r�ponses doivent aussi servir aux autres... d�o� l'int�r�t de ne pas trop s'�parpiller et de poster des codes qui permettent de reproduire le probl�me que vous rencontrez (ce qui rend la chose plus facile � identifier).

    Relisez votre dernier message, il y a un probl�me certes mais pour vous aider, il faut retrouver dans les posts pr�c�dents comment a �t� cr�� la table pour essayer de reproduire le probl�me.
    Vous esp�rez qu'on va faire �� pour vous?
    D'autant qu'il est quasi certain que ce comportement doit �tre d�crit dans la documentation.

    - 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.
Page 1 sur 2 12 Derni�reDerni�re

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