cptCarFil.py

text/x-python cptCarFil.py — 4.7 KB

Contenu du fichier

#!/usr/bin/env python

#  cptCharFil.py
#-------------------
# Ce programme l'occurence de certains caractères dans un texte à l'aide de fils d'exécution
#
# Paramètres sur la ligne de commandes
#  - Parm #1 : nombre de processus à utiliser
#  - Parm #2 : nom du fichier contenant le texte
#  - Parm #3 : nom du fichier de sortie

import sys
import time
from threading import Thread
from datetime import datetime

#------------------------------
# Contante globale -- ensemble des caractères à traiter
# ------------------------------
alpha = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
# Variable globale pour emmagasiner le décompte de caractères
nbCar = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

#----------------------------------------------------------------------
# decompte 
# 
# fonction qui  effectue le decompte des caractères
#
# Entrée : index - identifiant du fil
#          depart - indice début de la suite de caractères à traiter
#          fin - indice fin de la suite de caratères à traiter
#          texte - texte à traiter
#          ** alpha (globale) - caractères à compter
# Sortie : ** nbCar : variable globale modifiée par chaque fil
#
#
# ********************************************************
# Insérer le code de votre fonction ici *****************
#*********************************************************
def decompte(index, depart, fin, texte):
 
 
 
 
 
 
 
#********************************************************************************
#   Programme principale qui initialise et démarre les fils
#   
#   Entree : (sur la ligne de commandes)
#            nbFil - nombre de fils d'exécution
#            nom : fichier contenant le texte
#            nom_sortie : fichier contenat le résultat
#    
#********************************************************************************   
if __name__=="__main__":

    carParFil= [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
    
    # Obtention des paramètres
    nbFil = eval(sys.argv[1])     # nombre de fils d'exécution
    nom = str(sys.argv[2])        # nom du fichier contenant le texte
    nom_sortie = str(sys.argv[3]) # nom du fichier cntenant les résultats
    #--------------------------------
    # ***** Affichage pour mise au point
    print(nbFil, " --- " , nom, " -- ", nom_sortie)
    #------------------------------------
    #Lecture du texte    
    f = open(nom, mode = "r", encoding="latin-1")
    texte = f.read()   
    #--------------------------------------------
    # Détermination de la taille du texte à traiter par chaque pcs
    # ---------------------------------------------------------
    taille1 = int(62 / nbFil)
    taille2 = int(62 % nbFil)
    carParFil[0]=0
    # Répartition du «reste» du texte entre les processus
    for j in range(1, nbFil+1):
        if (taille2 > 0):
            carParFil[j] = carParFil[j-1] + taille1 + 1;
            taille2 = taille2 - 1
        else :
            carParFil[j] = carParFil[j-1] + taille1

    
    #---------------------------------------------------------
    # Positionnement du chronomètre pour évaluer la performance
    debut = datetime.now()
    #-------------------------------------------------
    # Initialisation et démarrage des fils d'exécution
    threads = []
    for n in range(0, nbFil):
        t = Thread(target=decompte, args=(n, carParFil[n], carParFil[n+1]-1, texte ))
        threads.append(t)
        t.start()
    #-------------------------------------------------
    # Attente de la fin de tous les fils
    for t in threads: t.join()
    #-------------------------------------------------
    # Arrêt du chronomètre
    fin = datetime.now()
    # -------------------------------------------------
    # Affichage du temps d'exécution
    delta = fin -debut
    print("Temps d'exécution en secondes = ", delta.total_seconds())
    # -------------------------------------------------
    # Sauvegarde du résultat dans fichier de sortie
    f = open(nom_sortie, mode = "w", encoding="utf-8")
    f.write("Occurences des caractères dans le texte : \n")
    for i in range(0,62):
        if ((i+1)%12 ==0):
            f.write("(")
            f.write(alpha[i])
            f.write(":")
            f.write(str(nbCar[i]))
            f.write(")\n")
        else:
            f.write("(")
            f.write(alpha[i])
            f.write(":")
            f.write(str(nbCar[i]))
            f.write("),")