Manipulations de fichiers texte I Travail préliminaire

publicité
Manipulations de fichiers texte
I Travail préliminaire
1) Rappel des instructions de base
Pour pouvoir travailler sur un fichier texte avec Python, il faut :
*l’ouvrir (avec open, en précisant le mode voulu : ‘r’ lecture,’w’ écriture, ‘a’
append(ajout) ))
*effectuer le traitement voulu
* le fermer ( avec close) ( ne pas oublier, sinon rien ne marche !! )
On a, pour cela, besoin de son chemin d’accés :
*sous linux, le chemin d’accès s’écrit avec des / ( par exemple /home/cpge/perso/essai.txt )
*sous windows les chemins d’accés sont écrits avec des \ .(par exemple
C:\Users\Claire\Documents\TRAVAILCLAIRE\BCPST2\ essai.txt)
Pour pouvoir les utiliser avec python, il faut doubler le \ . ou utiliser des / à la place de \ .
Pour savoir dans quel répertoire on travaille :
getcwd( )
( après avoir validé la commande from os import getcwd )
EVITER d’importer tout le package os…certaines commandes réservent des surprises
Pour changer le répertoire de travail courant et ainsi pouvoir taper seulement le nom du fichier
et son extension ( et éviter de taper tout le chemin d’accés) on utilise chdir
( après avoir validé la commande from os import chdir )
EVITER d’importer tout le package os…( mieux vaut le dire 2 fois qu’une !)
Par exemple on tape :
chdir("C:\\Users\\Claire\\Documents\\TRAVAILCLAIRE\\BCPST2\\info\\cours
basique\\infotous 2016 2017")
(ne pas oublier les " indiquant qu’on a une chaine de caractères
Remarque : lorsqu’un programme python crée un fichier, si l’on veut que ce fichier soit
directement enregistré dans le répertoire de travail sans se casser la tête avec le chemin
d’accés, il suffit de faire « ctrl+maj+E » ou « executer le script ». Attention , le shell est alors
réinitialisé !!
Pour ouvrir un fichier en lecture :
monfich=open(filename,’r’)
Ensuite , plusieurs façons d’avoir accès à son contenu :
* tout charger d’un coup :
contenu=monfich.readlines()#renvoie une liste de chaines de caractères, chacune
correspondant à une ligne ( y compris les caractères d’espacement, les tabulations, les
passages à la ligne…)
ou encore :
contenu=monfich.read()#renvoie une seule chaine de caractères correspondant à l’ensemble
du fichier ( y compris les caractères d’espacement, les tabulations, les passages à la ligne…)
inconvénient : souvent volumineux à charger d’un coup en mémoire ; on préfère en général
parcourir le fichier ligne par ligne comme suit :
* le parcourir sans tout charger, 2 possibilités :
1ère possibilité:
for ligne in monfich :
instructions …….
( en effet, un fichier est un itérable comme les listes, les intervalles….)
2ème possibilité :
ligne=monfich.readline( ) # lit une seule ligne à la fois
while ligne !=’’
ligne=monfich.readline()
instructions
Après avoir traité ce que l’on veut dans le fichier, on ferme le fichier :
monfich.close()
Remarques :rappels sur les chaînes de caractères :
*les caractères non imprimables le plus utilisés sont la tabulation « \t » et le passage à la ligne
« \n »
*on peut retirer le dernier caractère d’une chaine ( pour ici ce sera souvent le caractère de
passage à la ligne) ch = ch[:-1]
On peut aussi utiliser la méthode rstrip pour retirer le caractère de fin de ligne.( Voir aussi
lstrip et strip.)
*on peut séparer une chaine de caractères selon les espaces, tabulations, passage à la ligne et
récupérer une liste de chaines de caractères (split )
*on peut séparer une chaine de caractères et récupérer une liste de chaines de caractères en
choisissant soi-même les séparateurs (split,sep=
)
*le suffixe .txt pour les fichiers textes est ajouté automatiquement.
2) A tester
Taper et exécuter comme un script :
monfich=open("essai20162017","w")
for ch in ["a","ats","ajgj"]:
monfich.write(ch)
monfich.close()
monfich=open("essai20162017bis","w")
for ch in ["a","ats","ajgj"]:
monfich.write(ch+"\n")
monfich.close()
Aller ensuite voir en les ouvrant dans le bloc-note quel est le contenu de ces fichiers.
Tester les blocs de commandes :
monfich=open("essai20162017bis","r")
liste=monfich.readlines()
monfich.close()
print( liste)
liste_mots=[mot.rstrip() for mot in liste]
print(liste_mots)
monfich=open("essai20162017bis","r")
liste=monfich.read()
monfich.close()
print( liste)
# noter la différence en read et readlines
monfich=open("essai20162017bis","r")
for ligne in monfich:
print(ligne.rstrip() + " est de longueur "+str(len(ligne.rstrip())))
monfich.close()
II Exercices :
1er exercice
1) Ouvrir avec l’explorateur le fichier animaux.txt pour voir ce qu’il contient. Le refermer.
2) Avec Python maintenant, l’ouvrir en lecture et faire afficher les lignes
3) Faire afficher tous les noms de famille ( et rien d’autre).
4) Créer une liste avec tous les animaux de compagnie.
5) Créer une liste sans répétition avec tous les animaux de compagnie.
6) On veut rajouter deux personnes et leurs caractéristiques à l’aide de commandes Python :
Ouvrir le fichier en mode append ( ajout) et taper les commandes permettant d’insérer les
deux personnes en question ( monfich.write( ) ) et leurs caractéristiques ( attention au
format des chaînes de caractère, notamment au caractère de tabulation ) . Fermer le fichier,
puis vérifier que l’ajout voulu a bien eu lieu en rouvrant le fichier à la manière de votre choix.
7) Ecrire une suite d’instructions permettant de créer un fichier dans lequel il y a tous les
codes postaux.
2eme exercice :
1) Créer ( en l’ouvrant en mode écriture ) un fichier nombres_au_hasard.txt dans lequel une
suite d’instructions Python écrira 15 entiers choisis aléatoirement compris entre 2 et 37 ( 1 par
ligne).( Utiliser randint du module random)
2) Vérifier le contenu de votre fichier.
3) Ecrire une suite d’instructions qui ouvre nombres_au_hasard.txt et affiche la somme des
nombres qu’il contient.
4) Ecrire une suite d’instructions qui ouvre votre fichier et stocke dans un nouveau fichier
tous les nombres du premier dont l’écriture comporte au moins un « 3 ».
3ème exercice
Le fichier appelé nuagepoints.txt contient un certain nombre de lignes sous le modèle
suivant :
2.1502075417680935;8.88666051644748
-4.8234590531475625;-9.02952407740157
Dans chaque ligne sont écrits deux flottants séparés par un point-virgule, représentant
respectivement l’abscisse et l’ordonnée d’un point.
1) Ouvrir le fichier en lecture et construire la liste lx des abscisses et la liste ly des ordonnées
de ces points ;
2) Représenter ces points sur une figure ;
3) Pour ceux qui ont le temps :
a) Ecrire des fonctions donnant respectivement la moyenne et la variance de flottants
rangés dans une liste L.
Ecrire une fonction donnant la covariance de deux listes de flottants.
b) Ecrire une fonction renvoyant les coefficients de la droite de régression de Y en X,
où les valeurs de X et celles de Y sont donnés dans deux listes de même longueur.
c) A l’aide des fonctions précédentes, déterminer la droite de régression de Y en X du
nuage de points dont les points sont donnés dans le fichier nuagepoints.txt, et la tracer sur la
figure.
Téléchargement