notion de class et lecture de csv
Code:
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:
nouvel_acte= vls_actes.charger_csv(row)
l'exécution renvoi
Code:
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:
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?)
Solution faite sur la base de la des réflexions Tyrtamos
Voici le code creer sur la base des réflexions Tyrtamos
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
| # coding: utf-8
'''
Created on 23 mars 2018
@author:
'''
import csv
import sqlite3
import sys
import datetime
import csv
import os
import encodings
from unidecode import unidecode
from codecs import open
def convertie_date(src):
if src =='NULL':
valid_date = None
else:
alpha_aaaa = int(src[0:4])
alpha_mm = int(src[4:6])
alpha_jj = int(src[6:8])
try :
valid_date = datetime.date(alpha_aaaa,alpha_mm,alpha_jj)
return valid_date
except ValueError:
print('%s Date invalide !' % src)
return None
pass
def EstceNull(src):
if src =='NULL':
return None
else:
return src
def Estce_nombreNull(src):
if src =='NULL':
return None
else:
return int(src)
class ExcelFr(csv.excel):
# Séparateur de champ
delimiter = ";"
# Séparateur de ''chaîne''
quotechar = None
# Gestion du séparateur dans les ''chaînes''
escapechar = None
doublequote = True
# Fin de ligne
lineterminator = "\r\n"
# Ajout automatique du séparateur de chaîne (pour ''writer'')
quoting = csv.QUOTE_NONE
# Ne pas ignorer les espaces entre le délimiteur de chaîne
# et le texte
skipinitialspace = False
class vls_actes(object):
def __init__(self,liste):
self.ACT_CODE = EstceNull(liste[0]);
self.ACT_LIBELLE = EstceNull(liste[1]);
def __str__(self):
resultat = "Act_Code : " + str(self.ACT_CODE) + "\n"
resultat += "ACT_LIBELLE: " + str(self.ACT_LIBELLE )
return resultat
def table_sqllite(self,Base):
creer_table = """CREATE TABLE vsl_actes(
ACT_CODE TEXT(255) NOT NULL,
ACT_LIBELLE TEXT(255),
CONSTRAINT actes_pk PRIMARY KEY(ACT_CODE)
);
"""
detruire_table = """DROP TABLE IF EXISTS vsl_actes;"""
curseur = Base.cursor() # appel au curseur
# supprimer table existante
if(detruire_table !=""):
try:
curseur.execute(detruire_table)
except sqlite3.Error as e:
print("Problème"+ " :" + e.args[0] + " sur commande /n"+ detruire_table )
Base.rollback()
else:
Base.commit()
pass
if(creer_table !=""):
print("creer base")
try:
curseur.execute(creer_table)
except sqlite3.Error as e:
print("Problème"+ " :" + e.args[0] + " sur commande /n"++ creer_table )
Base.rollback()
else:
Base.commit()
pass
def insertion_sqllite(self,Base):
curseur = Base.cursor() # appel au curseur
data=[self.ACT_CODE,self.ACT_LIBELLE]
if(self.ACT_CODE == '9BFC1'):
print(data)
rq = """ INSERT INTO vsl_actes
(ACT_CODE, ACT_LIBELLE)
VALUES(?, ?);"""
try:
curseur.execute(rq,data)
except sqlite3.Error as e:
print("Problème"+ " :" + e.args[0] + " sur commande d'insertion /n" )
print(rq)
Base.rollback()
else:
Base.commit()
def actes(nomfichier,Base):
file = open(nomfichier, encoding='utf8')
i=0 # indeteur de ligne du fichier pour ne pas traiter l'entete
#
# Ouverture du fichier source.
#
try:
#
# Cr�ation du ''lecteur'' CSV.
#
fichier_lu = csv.reader(file, 'excel-fr')
max_long_ACT_CODE = 0
max_long_ACT_LIBELLE = 0
for row in fichier_lu:
i+=1
if(i>1):
nouvel_acte = vls_actes(row)
if(i==2): # Suppprsseion de la table pr�c�dente si besion
# cr�ation de la nouvelle table
nouvel_acte.table_sqllite(Base)
# insertion de donn�es
nouvel_acte.insertion_sqllite(Base)
if(max_long_ACT_CODE < len(nouvel_acte.ACT_CODE)):
max_long_ACT_CODE = len(nouvel_acte.ACT_CODE)
if(max_long_ACT_LIBELLE < len(nouvel_acte.ACT_LIBELLE)):
max_long_ACT_LIBELLE = len(nouvel_acte.ACT_LIBELLE)
#print(max_long_ACT_CODE, end='\n' )
#print(max_long_ACT_LIBELLE , end='\n')
except OSError:
print("Problème d'access au fichier :" + nomfichier)
finally:
#
# Fermeture du fichier source
#
file.close()
if __name__ == '__main__':
# Enregistre ce dialecte aupr�s du module csv
encodage ="utf-8"
LaBase ="nombase2.sq3"
Base = sqlite3.connect(LaBase)
csv.register_dialect('excel-fr', ExcelFr())
actes("actes.csv" , Base)
Base.close() |