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
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")
files
est une liste qui le nom de tous les fichiers sous le chemin stocker dans la variable folderpath
. random.shuffle(files)
pour mélanger aléatoirement la position de chaque nom de fichiers dans la liste files
. 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
. csvLine
avec le nom du fichier et le caractére numérique récupéré avec l'expression réculière "^(\d+)_"
.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()
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.
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
os.path.exists
si le dossier dans lequel nous allons mettre chaque fichier contenant chaque ligne di fichier donné en argument.file_counter
. Nous nous servirons de la valeur de cette variable pour donner un nom unique aux fichiers fraîchement créer. 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.
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.
file_to_files
. copy2
qui 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()