Compétence techniques utiles en TP #
Lire un fichier texte et mettre le contenu dans une variable de type str
#
On suppose que le fichier est encodé en utf8
. Si ce n’est pas le cas, on
peut tenter comme encodages : latin1
, latin9
, cp1252
.
with open("chemin/fichier.txt", encoding="utf8") as f:
txt = f.read()
ou (plus moderne) :
from pathlib import Path
txt = Path("chemin/fichier.txt").read_text(encoding="utf8")
Extraire les mots d’un texte #
Si on souhaite un résultat impeccable, le problème est difficile. On se contentera ici d’un découpage approximatif.
Il est envisageable de pré-traiter la chaîne pour la mettre entièrement en
minuscules ou en majuscules (texte.upper()
ou texte.lower()
).
Il est aussi envisageable de supprimer les accents avec quelque chose comme ça (laborieux, mais sans doute suffisant la plupart du temps) :
texte_sans_accent = texte.translate(str.maketrans("éèêëïöüäîôûâàç", "eeeeiouaiouaac"))
Autre solution, le module unicodedata
permet de gérer l’encodage (technique…) :
import unicodedata
nfkd_form = unicodedata.normalize('NFKD', "Avec éàôÀÔ et ça aussi !") # Mise sous forme normale
only_ascii = nfkd_form.encode('ASCII', 'ignore').decode('ASCII') # On ne garde que l'ASCII
Pour le découpage, utiliser split
ne suffit généralement pas à cause des ponctuations (mais ça peut valoir
le coup d’essayer comme ça en premier lieu) :
mots = texte.split()
On peut recherche aussi du côté du module de gestion des expressions
rationnelles re
: https://docs.python.org/fr/3/library/re.html#re.split
ou https://docs.python.org/fr/3/library/re.html#re.findall.
Lecture d’un fichier csv
#
Cette tâche est réalisable avec le module standard csv
(https://docs.python.org/3/library/csv.html), auquel il faut
fournir un objet itérable contenant le lignes du fichier. C’est donc à
combiner avec la lecture d’un fichier.
import csv
from pathlib import Path
lignes = Path("chemin/fichier.csv").read_text().splitlines()
data = []
for ligne in csv.reader(lignes, delimiter=','):
data.append((ligne[0], ligne[1])) # Ici on ne traite que les 2 premières colonnes
Dans le code qui précède, il faudra éventuellement convertir les nombres en
valeurs numériques : data.append((float(ligne[0]), ligne[1]))
par exemple.
Le module pandas
qui n’est pas dans la bibliothèque standard, permet de
faire la lecture plus simplement :
import pandas as pd
df = pd.read_csv("data/spam/probas_mails_nonspam.csv", header=None)
# pandas renvoie une Dataframe, qu'on peut convertir en
# liste de listes. Les conversions en nombres sont automatiques
data = df.values.tolist()
Si on ne précise pas header=None
, pandas
utilise la première ligne comme titre de colonne.