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?)