Consulter un fichier texte - Analyse de données d'un fichier CSV

**Définition** : un fichier texte est un fichier dont le contenu représente uniquement une suite de caractères (*lettres, chiffres*). Il possède un nom et a pour extension $\texttt{'.txt'}$

Remarque : Le bloc-note de Windows ou n'importe quel traitement de texte peut enregistrer les données saisies en un fichier texte ou encore appelé "texte brut".

Binder

1. Comment consulter un fichier texte depuis Python

Lire-Écrire-Ajouter

Lire un fichier $\texttt{'doc.txt'}$ nous permettra soit d'afficher les données qu'il contient soit de collecter une partie d'entre elles et de las stocker dans une liste ou un dictionnaire ...

Commande Rôle
Ouvrir $\texttt{f}$ $\texttt{f=open('doc.txt','r')}$ Ouvre $\texttt{f}$ en mode LECTURE $\texttt{r}$ est mis pour $\texttt{read}$ (lire en français)
Lire $\texttt{f}$ $\texttt{f.read()}$ Affiche le contenu de $\texttt{'doc.txt'}$ dans la console
$\texttt{f.readlines()}$ Récupère la liste des lignes de $\texttt{'doc.txt'}$
$\texttt{for a in f :}$ On parcourt les lignes de $\texttt{f}$. $\texttt{f}$ est donc itérable !
Fermer $\texttt{f}$ $\texttt{f.close()}$ Fermer $\texttt{f}$

On dispose du fichier texte $\texttt{'fruits.txt'}$ suivant :

fraise kiwi banane orange abricot

  • Lire avec $\texttt{f.read()}$
In [2]:
f=open('fruits.txt','r')
print(f.read())
f.close()
fraise
kiwi
banane
orange
abricot

  • Lire avec $\texttt{f.readlines()}$
In [3]:
f=open('fruits.txt','r')
L=f.readlines()
print(L)
f.close()
['fraise\n', 'kiwi\n', 'banane\n', 'orange\n', 'abricot\n']

$\texttt{\n}$ est le symbole qui crée un retour à la ligne dans le fichier texte. (Il signifie $\texttt{"Line feed"}$, "saut de ligne" en français)

Remarque : $\texttt{L = f.readlines()}$ est la liste des lignes de $\texttt{'fruits.txt'}$

  • $\texttt{L[0]}$ correspond à $\texttt{'fraise\n'}$
  • $\texttt{L[1]}$ correspond à $\texttt{'kiwi\n'}$
  • Lire en parcourant $\texttt{f}$
In [4]:
f=open('fruits.txt','r')
for a in f :
    print(a)
f.close()
fraise

kiwi

banane

orange

abricot

Remarque : l'affichage est le même qu'avec $\texttt{read}($$\ )$ sauf qu'en plus les sauts de lignes sont appliqués. Pour éviter les sauts de lignes, on propose :

In [5]:
f=open('fruits.txt','r')
for a in f :
    print(a.replace('\n',''))
f.close()
fraise
kiwi
banane
orange
abricot
  • Attention au séparateur décimal

$\texttt{'.'}$ est le séparateur décimal pour $\texttt{Python}$. Exemple : $\texttt{3.5}$ désigne le nombre réel $\texttt{3,5}$

On dispose du fichier $\texttt{'data.txt'}$

3 1,5 4,6

Pour collecter ces trois nombres dans une liste on peut faire :

In [10]:
L=[]
f=open('data.txt','r')
for a in f :
    a=a.replace('\n','')
    L.append(a.replace(',','.'))
f.close()
print(L)
['3', '1.5', '4.6']

On obtient une liste de chaines de caractères, pour obtenir la liste de nombre réels, on fera :

In [11]:
G=[float(s) for s in L]
print(G)
[3.0, 1.5, 4.6]

2. Écrire des données dans un fichier texte

Commande Rôle
Ouvrir $\texttt{f}$ $\texttt{f=open('doc.txt','w')}$ Ouvre $\texttt{f}$ en mode ÉCRITURE $\texttt{w}$ est mis pour $\texttt{write}$ (écrire en français)
Écrire $\texttt{f}$ $\texttt{f=write('donnees')}$ Écrit sur $\texttt{f}$ la chaîne de caractères $\texttt{'donnees'}$
Si $\texttt{'doc.txt'}$ existe déjà alors son contenu est effacé et $\texttt{Python}$ écrit les nouvelles données
Sinon $\texttt{'doc.txt'}$ est créé et $\texttt{Python}$ écrit les nouvelles données
Fermer $\texttt{f}$ $\texttt{f.close()}$ Fermer $\texttt{f}$

Exemple

On souhaite écrire les $10$ premiers multiples de $2$ :

$2,4,6,\ldots,20$

In [12]:
f=open('multiples2.txt','w')
f.write('Liste des multiples de 2:')
f.close()

Remarques :

  • rien n'est affiché en sortie !
  • puisque $\texttt{'multiple2.txt'}$ n'existait pas le fichier a été créé dans le même répertoire que le script $\texttt{Python}$ son contenu est

Liste des multiples de 2:

Amélioration du code :

In [13]:
f=open('multiples2.txt','w')
f.write('Liste des multiples de 2:')
for i in range (1,11):
    x=2*i
    f.write(str(x))
f.close()
print('fini')
fini

Liste des multiples de 2:2468101214161820

il n'y a pas d'espaces entre les différents multiples de 2 !

In [17]:
f=open('multiples2.txt','w')
f.write('Liste des multiples de 2:\n')
s=''
for i in range (1,11):
    x=2*i
    s = s + '{0:^4},'.format(x)
f.write(s[0:len(s)-1])
f.close()
print('fini')
fini

Liste des multiples de 2: 2 , 4 , 6 , 8 , 10 , 12 , 14 , 16 , 18 , 20


**Exercice** : On considère une année A.
  • Si A n'est pas divisible par $4$, l'année n'est pas bissextile
  • Si A est divisible par $4$, l'année est bissextile sauf si A est divisible par $100$ et pas par $400$
Écrire un script $\texttt{Python}$ permettant d'obtenir un fichier texte :
Année bissextile
2000 Oui
2001 Non
2002 Non
.. ..
2020 Oui
In [19]:
f=open('bissextile.txt','w')
f.write('{0:^10} | {1:^20}\n'.format("année","bisssextile"))
f.write('-'*30+'\n')
for A in range (2000,2021):
    if A%4==0 and (A%100>0 or A%400==0):
        s = '{0:^10} | {1:^20}\n'.format(A,'Oui')
    else :
        s = '{0:^10} | {1:^20}\n'.format(A,'Non')
    f.write(s)
f.close()
print('fini')
fini

3. Ajouter des données dans un fichier existant déjà

Commande Rôle
Ouvrir $\texttt{f}$ $\texttt{f=open('doc.txt','a')}$ Ouvre $\texttt{f}$ en mode AJOUT $\texttt{a}$ est mis pour $\texttt{append}$ (ajouter en français)
Écrire $\texttt{f}$ $\texttt{f=write('donnees')}$ Ajoute sur $\texttt{f}$ la chaîne de caractères $\texttt{'donnees'}$
Si $\texttt{'doc.txt'}$ existe déjà alors son contenu est complété par l'ajout des nouvelles données
Sinon $\texttt{'doc.txt'}$ est créé et $\texttt{Python}$ écrit les nouvelles données
Fermer $\texttt{f}$ $\texttt{f.close()}$ Fermer $\texttt{f}$

Exemple

On veut ajouter à la fin du fichier $\texttt{'fruits.txt'}$ le message "c'est excellent !"

In [20]:
f=open('fruits.txt','a')
f.write("c'est excellent !")
f.close()

4. Analyse de données d'un fichier CSV

Définition
Un fichier CSV est un fichier tableur, contenant des données (lettres, chiffres)
Pour chaque ligne, les données sont séparées par un caractère de séparation (généralement une virgule, un point-virgule ou une tabulation).
Un fichier CSV permet de traiter des données présentées dans un tableau, avec plus de facilité.
  • On peut lire un fichier $\texttt{CSV}$ à l'aide d'un tableur comme EXCEL ou OPENOFFICE

  • Nous souhaiterions ouvrir un fichier $\texttt{CSV}$ avec $\texttt{Python}$ et exploiter les données.

Exemple

Considérons le fichier $\texttt{csv}$ $\texttt{"tableau.csv"}$ correspondant à

A B
1 Valeurs de x Valeurs de y
2 0 0,5
3 2 -0,5
4 5 -2
5 7 -3
  • Lecture en tant que fichier texte
In [22]:
f=open('tableau.csv','r')
print(f.read())
f.close()
Valeurs de x;Valeurs de y
0;0,5
2;-0,5
5;-2
7;-3

Utiliser le module csv

Pour mieux accéder à n'importe quel élément de chacune de ces lignes, on préfera utiliser le module $\texttt{csv}$

Important Saisir en préambule :

In [23]:
import csv
  • Lire un fichier csv

Lire le fichier $\texttt{'doc.csv'}$ nous permettra soit d'afficher les données qu'il contient soit de collecter une partie d'entre elles et de les stocker dans une liste ou un dictionnaire ...

Commande Rôle
Ouvrir $\texttt{f}$ $\texttt{f=open('doc.csv','r')}$ Ouvre $\texttt{f}$ en mode LECTURE $\texttt{r}$
Ouvrir $\texttt{F}$ $\texttt{F=csv.reader(f,delimiter=';')}$ Ouvre l'objet fichier $\texttt{F}$ grâce au module $\texttt{CSV}$
Le paramètre $\texttt{delimiter=';'}$ précise que $\texttt{';'}$ sépare les éléments d'une ligne de $\texttt{'doc.csv'}$
Parcourir $\texttt{F}$ $\texttt{for a in F :}$ On parcourt les lignes de $\texttt{F}$. $\texttt{F}$ est donc itérable !
Fermer $\texttt{f}$ $\texttt{f.close()}$ Fermer $\texttt{f}$
In [25]:
import csv
f=open('tableau.csv','r')
F=csv.reader(f,delimiter=';')
for ligne in F :
    print(ligne)
f.close()
['Valeurs de x', 'Valeurs de y']
['0', '0,5']
['2', '-0,5']
['5', '-2']
['7', '-3']

Les éléments de $\texttt{F}$ sont les listes des éléments de chaque ligne de $\texttt{'tableau.csv'}$.

  • Ajouter une ligne de données à un fichier csv
Commande Rôle
Ouvrir $\texttt{f}$ $\texttt{f=open('doc.csv','a')}$ Ouvre $\texttt{f}$ en mode $\texttt{a}$
Ouvrir $\texttt{F}$ $\texttt{F=csv.writer(f,delimiter=';')}$ Ouvre l'objet fichier $\texttt{F}$ grâce au module $\texttt{CSV}$
Le paramètre $\texttt{delimiter=';'}$ précise que $\texttt{';'}$ sépare les éléments d'une ligne de $\texttt{'doc.csv'}$
Écrire $\texttt{F}$ $\texttt{F.writerow(['donnee1','donnee2'])}$ On ajoute la ligne $\texttt{'donnee1';'donnee2'}$ au fichier $\texttt{'doc.csv'}$
Fermer $\texttt{f}$ $\texttt{f.close()}$ Fermer $\texttt{f}$

Exemple

On souhaite ajouter à la fin du fichier $\texttt{tableau.csv}$, sur la même ligne, les nombres $10$ et $20$ :

In [28]:
import csv
f=open('tableau.csv','a')
F=csv.writer(f,delimiter=';')
F.writerow(['10','20'])
f.close()

**Exercice** :
  1. Écrire un script $\texttt{Python}$ qui calcule :
    • la moyenne des éléments de la plage $\texttt{A2:A6}$ notée $\texttt{a}$
    • la moyenne des éléments de la plage $\texttt{B2:B6}$ notée $\texttt{b}$
  2. Modifier ce script pour qu'il affiche ces nombres sur une même ligne, dans le fichier $\texttt{tableau.csv}$:
A B C D
1 Valeurs de x Valeurs de y
2 0 0,5
3 2 -0,5
4 5 -2
5 7 -3
6 10 20
7 moyenne des x 4.8 moyenne des y 3.0
In [32]:
import csv
import numpy as np

f=open('tableau.csv','r')
F=csv.reader(f,delimiter=';')
X=[]
Y=[]
for s in F :                 # F est iterable
    x=s[0].replace(',','.')  # Remplace la virgule par un .
    y=s[1].replace(',','.')
    X.append(x)
    Y.append(y)

A=X[1::]
B=Y[1::]

a = np.mean([float(a) for a in A])
b = np.mean([float(b) for b in B])
print(a,b)
f.close()
4.8 3.0
In [33]:
import csv
import numpy as np

#Lecture des donnees
f=open('tableau.csv','r')
F=csv.reader(f,delimiter=';')
X=[]
Y=[]
for s in F :                 # F est iterable
    x=s[0].replace(',','.')  # Remplace la virgule par un .
    y=s[1].replace(',','.')
    X.append(x)
    Y.append(y)

A=X[1::]
B=Y[1::]

a = np.mean([float(a) for a in A])
b = np.mean([float(b) for b in B])
f.close()

#Ecriture des moyennes
f=open('tableau.csv','a')
F=csv.writer(f,delimiter=';')
F.writerow(['moyenne des x',str(a),'moyenne des y',str(b)])
f.close()