def test_traiteOptionStd(option, verboseOK, sortiePgmOK): """ Test fonction d'analyse des options courantes """ config = configparser.RawConfigParser() config.read('FinancesLocales.properties') verbose, sortiePgm = utilitaires.traiteOptionStd(config, option, "Test", "Doc", []) assert verbose == verboseOK assert sortiePgm == sortiePgmOK
def main(argv=None): """ Génere l'index des départements """ # Valeur par défaut des options verbose = False # Lecture du fichier de propriétés config = configparser.RawConfigParser() config.read('FinancesLocales.properties') ############################# # Analyse des arguments reçus ############################# if argv is None: argv = sys.argv nomProg = os.path.basename(argv[0]) # parse command line options try: opts, args = getopt.getopt(argv[1:], "huvV", ["help", "usage", "version", "verbose"]) except getopt.error as msg: print(msg) print("To get help use --help ou -h") sys.exit(1) # process options for opt in opts: verboseOpt, sortiePgm = \ utilitaires.traiteOptionStd(config, opt[0], nomProg, __doc__, ["../Resultats",]) verbose = verbose or verboseOpt if sortiePgm: sys.exit(0) utilitaires.checkPythonVersion(config, verbose) if len(args) != 1: print(f'{__doc__}\nDonnez 1 paramètres :\n' "chemin des résultats de genCode.py !" f"\nau lieu de : {len(args)}") sys.exit(1) if not args[0]: raise ValueError("Donnez un chemin de répertoire à traiter !") resultatsPath = args[0] print('Début de', nomProg) # Recherche des départements présents repertoireBase = config.get('EntreesSorties', 'io.repertoireBase') listeDepartements = [ os.path.join(resultatsPath, nomRepDept) for nomRepDept in os.listdir(resultatsPath) if os.path.join(resultatsPath, nomRepDept) and nomRepDept.startswith(repertoireBase + '_') ] assert len(listeDepartements) > 0, "Aucun département à traiter !" if verbose: print(f'{len(listeDepartements)} départements présents.') # Génération de la notice de déploiement genHTML.genIndexDepartement(config, resultatsPath, verbose) print('Fin de', nomProg, ": transférez le répertoire",\ resultatsPath, "sur le site Web.")
def main(argv=None): """ Stocke dans la base de données les villes indiquées dans une liste Sans accès à Internet. """ # Valeur par défaut des options verbose = False # Lecture du fichier de propriétés config = configparser.RawConfigParser() ficProperties = 'FinancesLocales.properties' config.read(ficProperties) ############################# # Analyse des arguments reçus ############################# if argv is None: argv = sys.argv nomProg = os.path.basename(argv[0]) # parse command line options try: opts, args = getopt.getopt(argv[1:], "huvV", ["help", "usage", "version", "verbose"]) except getopt.error as msg: print(msg) print("Pour avoir de l'aide : --help ou -h", file=sys.stderr) sys.exit(1) # process options for option, arg in opts: verboseOpt, sortiePgm = \ utilitaires.traiteOptionStd(config, option, nomProg, __doc__, ['../database/minfi.db', '../Listes_villes_par_departement']) verbose = verbose or verboseOpt if sortiePgm: sys.exit(0) # Récuperation et analyse des paramètres if len(args) != 2: msg = (f"{__doc__}\nDonnez au moins 2 paramètres :\n" "\tchemin base .db, nom répertoire des listes de villes !\n" f"\tau lieu de : {len(args)}") print(msg, file=sys.stderr) sys.exit(1) # Vérifie et récupère le nom de la base à mettre à jour databasePath = args[0] if not databasePath.endswith(".db"): msg = (f"{__doc__}\nErreur : " "Le nom de la base de donnée doit se terminer par .db :\n" f"\t{databasePath}") print(msg, file=sys.stderr) sys.exit(2) # Vérifie et récupère le nom du répertoire contenant les fichiers de villes par dépatement listeVillesPath = args[1] if not os.path.isdir(listeVillesPath): msg = (f"{__doc__}\nErreur : " "Le répertoire des villes par département doit exister :\n" + \ f"\t{listeVillesPath}") print(msg, file=sys.stderr) sys.exit(2) listeVillesFic = [ fic for fic in os.listdir(listeVillesPath) if fic.endswith(".txt") and '_' in fic ] if not listeVillesFic: msg = (f"{__doc__}\nErreur : " f"Le répertoire des villes {listeVillesPath}\n" + \ "\tne contient aucun fichier d'extension .txt et incluant un _") print(msg, file=sys.stderr) sys.exit(3) print(f"Début de {nomProg}") for ficVille in listeVillesFic: try: posPoint = ficVille.rindex('.') posUnderscore = ficVille.rindex('_') numDep = ficVille[posUnderscore + 1:posPoint] if len(numDep) == 2: numDep = f"0{numDep}" if isnumDep(numDep): print(f"Récupère les villes pour le département {numDep}") listeVilles4Bd = recupVillesListe(config, listeVillesPath, numDep, verbose) database.enregistreVilleWKP(config, databasePath, listeVilles4Bd, verbose) else: raise ValueError(f"Numéro de département invalide : {numDep}") except ValueError as exc: print(f"Fichier {ficVille} ignoré :\n{exc}") except sqlite3.IntegrityError: print( f"Fichier {ficVille} ignoré :\ndoublons code commune détectés") print("Lancer updateDataMinFi.py pour extraire les infos") print(f"Fin de {nomProg}")
def main(argv=None): """ Met à jour la base de données avec les scores Wikipedia. """ # Valeur par défaut des options verbose = False isFast = False # Lecture du fichier de propriétés config = configparser.RawConfigParser() ficProperties = 'FinancesLocales.properties' config.read(ficProperties) ############################# # Analyse des arguments reçus ############################# if argv is None: argv = sys.argv nomProg = os.path.basename(argv[0]) # parse command line options try: opts, args = getopt.getopt(argv[1:], "huvVf", ["help", "usage", "version", "verbose", "fast"]) except getopt.error as msg: print(msg) print("Pour avoir de l'aide : --help ou -h", file=sys.stderr) sys.exit(1) # process options for opt in opts: verboseOpt, sortiePgm = \ utilitaires.traiteOptionStd(config, opt[0], nomProg, __doc__, ['database/minfi.db']) verbose = verbose or verboseOpt if sortiePgm: sys.exit(0) if opt[0] in ("-f", "--fast"): print("mode fast : ne traite que les villes de scores inconnus") isFast = True utilitaires.checkPythonVersion(config, verbose) # Récuperation et analyse des paramètres if len(args) != 1: msg = __doc__ + "\nDonnez 1 paramètre :\n" + \ "chemin base .db !" + \ "\nau lieu de : " + str(len(args)) print(msg, file=sys.stderr) sys.exit(1) # Vérifie et récupère le nom de la base à mettre à jour databasePath = args[0] if not databasePath.endswith(".db"): msg = __doc__ + "Erreur : Le nom de la base de donnée doit se terminer par .db :\n" + \ databasePath print(msg, file=sys.stderr) sys.exit(2) print('Début de', nomProg) # Crée la base de données si elle n'existe pas connDB = database.createDatabase(config, databasePath, verbose) # Récupère la liste des villes et des années présentes dans la base listeCodeCommuneNomWkp = database.getListeCodeCommuneNomWkp(connDB, isFast, "score", verbose) if not listeCodeCommuneNomWkp: msg = "Erreur : La base de données :\n" + databasePath + \ "\n ne contient aucune ville à extraire, lancer extractionWikipediaFr" print(msg, file=sys.stderr) # Calcule les scores pour chaque commune scoresVille = recupScoreDataVilles(config, listeCodeCommuneNomWkp, verbose) # Met à jour la base de données database.updateScoresVille(connDB, scoresVille, verbose) print("Sortie de", nomProg)
def main(argv=None): """ Met à jour les données de groupement de communes de la base de données du ministère des finances à partir des fichiers .csv du répertoire passé en paramètres. """ # Valeur par défaut des options verbose = False # Lecture du fichier de propriétés config = configparser.RawConfigParser() ficProperties = 'FinancesLocales.properties' config.read(ficProperties) ############################# # Analyse des arguments reçus ############################# if argv is None: argv = sys.argv nomProg = os.path.basename(argv[0]) # parse command line options try: opts, args = getopt.getopt(argv[1:], "huvV", ["help", "usage", "version", "verbose"]) except getopt.error as msg: print(msg) print("Pour avoir de l'aide : --help ou -h", file=sys.stderr) sys.exit(1) # process options for opt in opts: verboseOpt, sortiePgm = \ utilitaires.traiteOptionStd(config, opt[0], nomProg, __doc__, \ ['database/minfi.db ../recup_data_gouv_fr_colectivite/comptes-groupements.csv']) verbose = verbose or verboseOpt if sortiePgm: sys.exit(0) utilitaires.checkPythonVersion(config, verbose) # Récuperation et analyse des paramètres if len(args) != 2: msg = __doc__ + "\nDonnez au moins 2 paramètres :\n" + \ "chemin base .db et fichier .csv !" + \ "\nau lieu de : " + str(len(args)) print(msg, file=sys.stderr) sys.exit(1) # Vérifie et récupère le nom de la base à mettre à jour databasePath = args[0] if not databasePath.endswith(".db"): msg = __doc__ + "Erreur : Le nom de la base de donnée doit se terminer par .db :\n" + \ databasePath print(msg, file=sys.stderr) sys.exit(2) # Vérifie et récupère les noms des fichiers de données du ministère des finances pathCSVDataGouvFr = args[1] if not os.path.isfile(pathCSVDataGouvFr): msg = __doc__ + "Erreur : paramètre fichier .csv !\n" + \ "Ce fichiers .csv doit être récupérés sur\n" + \ config.get('Extraction', 'dataGouvFr.ComptesComptesGroupements') + ":\n" + \ pathCSVDataGouvFr print(msg, file=sys.stderr) sys.exit(3) print('Début de', nomProg) # Crée la base de données si elle n'existe pas connDB = database.createDatabase(config, databasePath, verbose) # Récupère les numéros de SIREN des groupements dans la base # ainsi que leurs noms et années des infos financières déjà enregistrées. dictSirenInfos = database.getSirenInfosGroupementsAnnees(connDB, verbose) if not dictSirenInfos: msg = "Erreur : La base de données :\n" + databasePath + \ "\n ne contient aucun groupement de commune à extraire," +\ "lancer updateGroupementsCommunes" print(msg, file=sys.stderr) # Met à jour la base de données le fichier .CSV passé en paramètres print("Traitement de :", pathCSVDataGouvFr, "...") with open(pathCSVDataGouvFr, mode='rt', buffering=config.getint('Extraction', 'updateDataMinFi.bufferReadingSize'), encoding='utf-8') as hFicMinFi: # Analyse l'entête du fichier header = hFicMinFi.readline().strip() dictPositionColumns, listMissingKeys = \ updateDataMinFiCommon.getColumnPosition(header, "GC", connDB, verbose) # Print missing columns if len(listMissingKeys) > 0: print("Attention : les motcles suivants n'ont pas été trouvés :\n", ";".join(listMissingKeys)) # Enregistre si nécessaire chaque ligne du fichier numLine = 1 numGroupement = 0 for ligneVille in hFicMinFi: numLine += 1 dictValues = analyseLigneGroupement(ligneVille, dictPositionColumns, verbose) # Analyse et enregistre les valeurs de cette ligne if "siren" in dictValues and dictValues["siren"].isdigit() and \ len(dictValues["siren"]) == 9 and \ "exer" in dictValues and dictValues["exer"].isdigit() and \ len(dictValues["exer"]) == 4 and \ dictValues["siren"] in dictSirenInfos and \ int(dictValues["exer"]) not in dictSirenInfos[dictValues["siren"]][2]: numGroupement += 1 database.enregistreLigneGroupementMinFi( dictValues, connDB, verbose) print('.', end='', flush=True) else: print('X', end='', flush=True) print("\n", numLine - 1, "lignes traitées,", numGroupement, "groupements enregistrés") # Ferme la base de données database.closeDatabase(connDB, verbose)
def main(argv=None): """ Met à jour la base de données avec les infos sur les regroupements de communes. """ # Valeur par défaut des options verbose = False isFast = False # Lecture du fichier de propriétés config = configparser.RawConfigParser() ficProperties = 'FinancesLocales.properties' config.read(ficProperties) ############################# # Analyse des arguments reçus ############################# if argv is None: argv = sys.argv nomProg = os.path.basename(argv[0]) # parse command line options try: opts, args = getopt.getopt(argv[1:], "huvVf", ["help", "usage", "version", "verbose", "fast"]) except getopt.error as msg: print(msg) print("Pour avoir de l'aide : --help ou -h", file=sys.stderr) sys.exit(1) # process options for opt in opts: verboseOpt, sortiePgm = \ utilitaires.traiteOptionStd(config, opt[0], nomProg, __doc__, ['database/minfi.db']) verbose = verbose or verboseOpt if sortiePgm: sys.exit(0) if opt[0] in ("-f", "--fast"): print("\nMode fast : ne traite que les villes (non anciennes)\n" "\tdont les numéros de SIREN sont inconnus") isFast = True utilitaires.checkPythonVersion(config, verbose) # Récuperation et analyse des paramètres if len(args) not in [1, 2]: print(f'{__doc__}\nDonnez 1 ou 2 paramètres :\n' "chemin base .db\nOptionnel : nb max de villes à traiter !" f"\nau lieu de : {len(args)}", file=sys.stderr) sys.exit(1) # Vérifie et récupère le nom de la base à mettre à jour databasePath = args[0] if not databasePath.endswith(".db"): print(f'{__doc__}\nNom de base de données non valide :\n' f'il doit se terminer par .db : {databasePath}', file=sys.stderr) sys.exit(2) nbMaxVille = 0 if len(args) == 2: nbMaxVille = int(args[1]) print('Début de', nomProg, "database=", databasePath, ', nbMaxVille=', nbMaxVille) # Ouvre la base de données connDB = database.createDatabase(config, databasePath, verbose) # Récupère la liste des villes et des années présentes dans la base listeCodeCommuneNomWkp = \ database.getListeCodeCommuneNomWkp(connDB, isFast, "sirenGroupement", verbose) if not listeCodeCommuneNomWkp: print(f'Erreur : La base de données :\n{databasePath}' "\n ne contient aucune ville à extraire, lancer extractionWikipediaFr", file=sys.stderr) if nbMaxVille > 0: print(f'Attention : seulement {nbMaxVille} communes traitées !' "\nUtilisez l'option -f au prochain run.") listeCodeCommuneNomWkp = listeCodeCommuneNomWkp[:nbMaxVille] print("\nCodes utilisés :\n" "- . Extraction d'une page Wikipédia ;\n" "- Z Attente pour ne pas surcharger Wikipédia ;\n" "- A Ancienne commune : ignorée et marquée dans la base ;\n" "- R Page de redirection traversée ;\n") print("Récuperation des noms des groupements des villes...") nomCCVilles = recupNomCCVilles(config, listeCodeCommuneNomWkp, verbose) print("Récupération des infos sur les communautés de communes...") # Récupération des infos sur les communautés de communes listeSirenCodeCommune, dictSirenInfoCC = recupInfosCC(config, nomCCVilles, verbose) # Met à jour la base de données print("Enregistrement dans la base...") database.updateInfosGroupement(connDB, listeSirenCodeCommune, dictSirenInfoCC, verbose) print("Sortie de", nomProg)
def main(argv=None): """ Génère le Wikicode et du HTML pour les villes d'un département """ # Valeur par défaut des options verbose = False # Lecture du fichier de propriétés config = configparser.RawConfigParser() config.read('FinancesLocales.properties') ############################# # Analyse des arguments reçus ############################# if argv is None: argv = sys.argv nomProg = os.path.basename(argv[0]) # parse command line options try: opts, args = getopt.getopt(argv[1:], "huvV", ["help", "usage", "version", "verbose"]) except getopt.error as msg: print(msg) print("To get help use --help ou -h") sys.exit(1) # process options for opt in opts: verboseOpt, sortiePgm = \ utilitaires.traiteOptionStd(config, opt[0], nomProg, __doc__, ["../database/minfi.db ../Resultats",]) verbose = verbose or verboseOpt if sortiePgm: sys.exit(0) utilitaires.checkPythonVersion(config, verbose) isMatplotlibOk = utilitaires.checkMatplolibOK() if len(args) != 2: print(f'{__doc__}\nDonnez 2 paramètres :\n' "chemin base .db et chemin des résultats !" f"\nau lieu de : {len(args)}") sys.exit(1) databasePath = args[0] if not os.path.isfile(databasePath): raise ValueError( f"Le fichier base de données {databasePath} n'existe pas !") if not args[1]: raise ValueError("Donnez un chemin de répertoire résultat !") resultatsPath = os.path.normcase(args[1]) print('Début de', nomProg) print("databasePath =", databasePath) print("resultatsPath =", resultatsPath) genCodeCommon.createResultDir(config, resultatsPath) # Ouvre la base de données connDB = database.createDatabase(config, databasePath, verbose) # Récup et traitement des départements traiteDepartement(config, nomProg, isMatplotlibOk, connDB, resultatsPath, verbose) # Ferme la base de données database.closeDatabase(connDB, verbose)
def main(argv=None): """ Met à jour la base de données du ministère des finances à partir des fichiers .csv du répertoire passé en paramètres. """ # Valeur par défaut des options verbose = False # Lecture du fichier de propriétés config = configparser.RawConfigParser() ficProperties = 'FinancesLocales.properties' config.read(ficProperties) ############################# # Analyse des arguments reçus ############################# if argv is None: argv = sys.argv nomProg = os.path.basename(argv[0]) # parse command line options try: opts, args = getopt.getopt(argv[1:], "huVv", ["help", "usage", "version", "verbose"]) except getopt.error as msg: print(msg) print("Pour avoir de l'aide : --help ou -h", file=sys.stderr) sys.exit(1) # process options for option, arg in opts: verboseOpt, sortiePgm = \ utilitaires.traiteOptionStd(config, option, nomProg, __doc__, ['database/minfi.db ../recup_data_gouv_fr']) verbose = verbose or verboseOpt if sortiePgm: sys.exit(0) utilitaires.checkPythonVersion(config, verbose) # Récuperation et analyse des paramètres if len(args) != 2: msg = __doc__ + "\nDonnez au moins 2 paramètres :\n" + \ "chemin base .db et répertoire des .csv !" + \ "\nau lieu de : " + str(len(args)) print(msg, file=sys.stderr) sys.exit(1) # Vérifie et récupère le nom de la base à mettre à jour databasePath = args[0] if not databasePath.endswith(".db"): msg = __doc__ + "Erreur : Le nom de la base de donnée doit se terminer par .db :\n" + \ databasePath print(msg, file=sys.stderr) sys.exit(2) # Vérifie et récupère les noms des fichiers de données du ministère des finances pathCSVDataGouvFr = args[1] listFileCSVMinFi = [] try: listFileCSVMinFi = checkPathCSVDataGouvFr(config, pathCSVDataGouvFr, verbose) except ValueError as exc: msg = __doc__ + "Erreur : paramètre répertoire des .csv !\n" + \ "Ce repertoire doit contenir les fichiers .csv" + \ "de données récupérés sur\n" + \ config.get('Extraction', 'dataGouvFr.Comptes') + "\n" + \ str(exc) print(msg, file=sys.stderr) sys.exit(3) print('Début de', nomProg) # Crée la base de données si elle n'existe pas connDB = database.createDatabase(config, databasePath, verbose) # récupère la liste des villes et des années présentes dans la base dictCodeCommuneAnnees = database.getDictCodeCommuneAnnees(connDB, verbose) if not dictCodeCommuneAnnees: msg = "Erreur : La base de données :\n" + databasePath + \ "\n ne contient aucune ville à extraire, lancer extractionWikipediaFr" print(msg, file=sys.stderr) # Met à jour la base de données avec chaque fichier .CSV trouvé for fileCSVMinFi in listFileCSVMinFi: print("Traitement de :", fileCSVMinFi, "...") with open(fileCSVMinFi, mode='rt', buffering=config.getint('Extraction', 'updateDataMinFi.bufferReadingSize'), encoding='utf-8') as hFicMinFi: # Analyse l'entête du fichier header = hFicMinFi.readline().strip() dictPositionColumns, listMissingKeys = \ updateDataMinFiCommon.getColumnPosition(header, "V", connDB, verbose) # Print missing columns if len(listMissingKeys) > 0: print( "Attention : les motcles suivants n'ont pas été trouvés :\n", ";".join(listMissingKeys)) # Enregistre si nécessaire chaque ligne du fichier numLine = 1 for ligneVille in hFicMinFi: numLine += 1 dictValues = analyseLigneVille(config, ligneVille, dictPositionColumns, verbose) if dictValues['codeCommune'] in dictCodeCommuneAnnees and \ int(dictValues[config.get("cleFi1Valeur", "clefi.annee")]) \ not in dictCodeCommuneAnnees[dictValues['codeCommune']]: database.enregistreLigneVilleMinFi(config, dictValues, connDB, verbose) print(numLine - 1, "villes traitées.") # Ferme la base de données database.closeDatabase(connDB, verbose)