Exemplo n.º 1
0
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
Exemplo n.º 2
0
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.")
Exemplo n.º 3
0
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}")
Exemplo n.º 4
0
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)
Exemplo n.º 5
0
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)
Exemplo n.º 6
0
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)
Exemplo n.º 7
0
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)
Exemplo n.º 8
0
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)