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 715
    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 715
    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 715
    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 715
    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 827
    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 827
    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 715
    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 715
    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 715
    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 715
    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 715
    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 715
    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 715
    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 715
    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