Exercice 1

Dans cet exercice, nous allons créer un fichier csv qui contiendra deux colonnes. La première est relative au nom du fichier et la deuxième à son identifiant. Nous allons dans une première étape parcourir l'ensemble des fichiers dans un dossier et dans une seconde étape récupérer l'identifiant à partir du nom des fichiers parcouru.

  • Le programme python contient une seule fonction qui prend en entrée le chemin du dossier contenant le fichier et donne en sortie un fichier csv avec deux colonnes. Nous allons utilser les modules os, csv, re et les fonctions open() et write().

  • Nous importons d'abord les modules dont nous avons besoin.


In [5]:
import sys, os
import re
from os import listdir
from os.path import isfile, join
  • Nous créeons ensuite notre fonction que nous appellerons fromFileToCSV. Cette fonction prend deux arguements : le chemin vers le dossier et le nom du fichier csv. La signature de la fonction est comme suit, fromFileToCSV(folderpath, csvfilename)

In [6]:
def fromFileToCSV (folderpath,csvfilename) :
    files = [f for f in listdir(folderpath) if isfile(join(folderpath, f))]
    random.shuffle(files)

    for filepath in files:
        if filepath.endswith(".png"):
            label = re.findall("^(\d+)_",filepath)
            csvLine = filepath+","+str(label[0])
            print csvLine
            """
            Le with open remplace toutes ces lignes ci dessous.
            myfile = open(join(folderpath,csvfilename), "a")
            content = myfile.read()
            content = content + "\n" + csvLine 
            myfile.write(content)
            myfile.write("\n")
            myfile.close()
            """
            with open(join(folderpath,csvfilename), "a") as myfile:
                
                myfile.write(csvLine)
                myfile.write("\n")
  • La variable files est une liste qui le nom de tous les fichiers sous le chemin stocker dans la variable folderpath.
  • Nous utilisons random.shuffle(files) pour mélanger aléatoirement la position de chaque nom de fichiers dans la liste files.
  • Nous parcourons la liste files avec un boucle for et pour chaque fichier avec l'extention .png nous récupérons dans la variable label le premier caractére numérique qui est présent dans le nom du fichier filepath.
  • Nous initialisons la variable csvLine avec le nom du fichier et le caractére numérique récupéré avec l'expression réculière "^(\d+)_".
  • Nous ouvrons un fichier csv fourni en argument à la fonction et écrivant la ligne cotenu dans csvLine.

In [ ]:
def main (): 
    fromFileToCSV("./lines","fichier_auteur.csv")

In [ ]:
if __name__ == '__main__':
    """
    Si je veux exécuter un fichier python sur la console en prenant compte des arguements donnés dans la console. 
    Par exemple : >> python nomfichier.py nomDossier, nomFichierCSV. 
    
    if len(sys.argv) == 3:
        fromFileToCSV(sys.argv[1],sys.argv[2])
    """
    
    main()

Exercice 2

Dans cet exercice, nous allons construire un corpus ou une collection de documents à partir d'un fichier texte. Ce fichier contient plusieurs lignes qui correspondent à des tweets. D'abord, et après avoir ouvert le fichier, pour chaque ligne dans ce dernier nous allons créer un nouveau fichier. Cette étape nous donnera un dossier contenant un nombre de fichiers égal au nombre de ligne dans le fichier d'origine. Ensuite, et suivant une certaine proportion que nous allons fournir comme paramètre d'entrée nous allons diviser l'ensemble de fichiers en trois dossiers.

  • Le programme contenient deux fonctions : la première prendra en entrée le fichier d'origine et donnera en sortie un dossier avec un nombre de fichiers égales au nombre de lignes dans le fichier d'origine. La deuxième fonction prendra comme entrée le chemin relatif ou absolu du dossier fraîchement créé ainsi que trois proportions. C'est-à-dire que la deuxième fonction donnera en sortie trois dossiers avec par exemple 20% des fichiers seront copié dans le premier dossier, 30% des fichiers seront copié dans le deuxième dossier et 50% des fichiers seront copiés dans le troisième dossier.

In [ ]:
import sys, os 
import shutil
import re
import random
from os import listdir
from os.path import isfile, join

In [ ]:
def file_to_files (original_file_path):

    if not os.path.exists("lines_folder"):
        os.makedirs("lines_folder")
    file_counter = 0
    my_file = open(original_file_path)
    lines_liste = my_file.readlines()
    for line in lines_liste:
        file_counter += 1
        my_new_file = open("lines_folder/"+str(file_counter)+'_processed_tweet.txt', 'a')
        my_new_file.write(line)
        my_new_file.close()
    my_file.close()
    new_folder = "lines_folder"
    return new_folder
  • Nous vérifions d'abord avec la fonction os.path.exists si le dossier dans lequel nous allons mettre chaque fichier contenant chaque ligne di fichier donné en argument.
  • Nous initialisons un compteur de lignes avec une variable numérique que nous appelons file_counter. Nous nous servirons de la valeur de cette variable pour donner un nom unique aux fichiers fraîchement créer.
  • Nous ouvrons ensuite le fichier original_file_path et parcourons ligne par ligne. À chaque ligne nous créerons un nouveau fichier et écrivons la ligne que nous venons de lire dans le fichier.
  • La fonction retourne le nom du dossier qui contient tous les fichiers que nous venons de créer.

In [7]:
def from_folder_to_folders (original_folder_path, percentageFolder1, percentageFolder2, percentageFolder3):
    
    list_fichiers_dans_dossier = listdir(orginal_folder_path)
    files = [f for f in list_fichiers_dans_dossier if isfile(join(original_folder_path,f))]
    
    """
    Ces instruction sont équivalentes à la création de la liste files qui est au dessus 
    for f in list_fichier_dans_dossier:
        if isfile(join(original_folder_path,f):
                  files.add(f)
    """
    
    """
    Documentation de random https://docs.python.org/2/library/random.html
    """
    
    """
    Nous mélangeons l'ordre des fichiers dans la liste pour avoir plus de diversité dans chaque dossier.
    """
    random.shuffle(files)

    nbFilesFolder1 = int((float(percentageFolder1)/100)*len(files))
    nbFilesFolder2 = int((float(percentageFolder2)/100)*len(files))
    nbFilesFolder3 = int((float(percentageFolder3)/100)*len(files))


    if not os.path.exists(join(original_folder_path,"Folder1")):
        os.makedirs(join(original_folder_path,"Folder1"))
    if not os.path.exists(join(original_folder_path,"Folder2")):
        os.makedirs(join(original_folder_path,"Folder2"))
    if not os.path.exists(join(original_folder_path,"Folder3")):
        os.makedirs(join(original_folder_path,"Folder3"))

        """
        enumerate retourne l'index + le contenu de la liste files.
        """
    for j,filepath in enumerate(files):
        # e.g. sourceFolder = lines_folder/11314_processed_tweet.txt
        # "lines_folder/Folder2/"
        sourceFolder = os.path.join(original_folder_path,filepath)
        
        if (j > nbFilesFolder1 and j < nbFilesFolder1+nbFilesFolder2):
            print "copying the files to folder 2"
            if filepath.endswith(".txt"):
                shutil.copy2(sourceFolder,join(original_folder_path,"Folder2/"))
        elif (j > nbFilesFolder1+nbFilesFolder2 and j < len(files)):
            print "copying the files to folder 3"
            if filepath.endswith(".txt"):
                shutil.copy2(sourceFolder,join(original_folder_path,"Folder3/"))
        else:
            print "copytin the files to folder 1"
            if filepath.endswith(".txt"):
                shutil.copy2(sourceFolder, join(original_folder_path,"Folder1/"))

Le but de la fonction from_folder_to_folders est de parcourir le dossier retourner par la fonction file_to_files et de copier l'ensemble des fichiers en trois dossiers selon trois proportions données en arguments et représentés par des pourcentages.

  • D'abord nous créons une liste qui contient tous les fichiers dans le dossier retourné par la fonction file_to_files.
  • Ensuite et pour chaque fichier dans cette liste nous allons récupéré le chemin relatif du fichier et vérifier s'il s'agit bien d'un fichier texte.
  • Nous calculons le nombre de fichiers qui doit être mis dans chacun des trois dossiers avec l'équation suivante :
\begin{equation*} proportions\_fichiers = \frac{pourcentage}{100} \times nombre\_total\_des\_fichiers \end{equation*}
  • Une fois que nous avons la liste de fichiers, nous parcourons la liste selon les proportions fournies en arguments et utilisons la fonction copy2qui prend en entrée le chemin relatif de la source et le chemin relatif de la destination vers laquelle le fichier va être copié.

In [ ]:
def main():
    
    file_to_files("data/preprocessedP.txt")
    #from_folder_to_folders(file_to_files("data/preprocessedP.txt"), 50, 30, 20)

if __name__ == '__main__':
    main()