Les fichiers

Notions élémentaires

Importance des fichiers

  • Sauvegarder le contenu des variables de votre programme.
  • Récupérer le contenu d'une liste de valeurs (resultats d'une expérience, sauvegarde de votre jeu favori...)

Comment nommer un fichier ?

Ne pas oublier qu’un fichier peut avoir une vie professionnelle plus longue que votre ordinateur et que votre système d’exploitation actuel

  • Éviter les accents et les caractères spéciaux tant que possible
  • Remplacer un espace ou un apostophe par un tiret bas _ ou bien utiliser des majuscules pour les premières lettres des mots
  • Eviter d’utiliser le point, il est réservé à la séparation du nom de fichier et de son type
  • Les fichiers commençant par des chiffres sont en premier dans une liste triée

Chemin d'accès à un fichier

  1. Chemin absolu : À partir de la racine du périphérique de stockage, pour le disque dur de l’ordinateur on a généralement :

    • Sur Linux : /
    • Sur Windows : C:\\

  2. Chemin relatif: À partir du dossier courant

    • Sous linux : d'après une image extraite d'un cours de Marcel Bosc

Manipuler les fichiers

Ouvrir un fichier

  • Pour cela on dispose de la fonction open() directement accessible à partir de python
In [ ]:
print dir(__builtins__)
In [ ]:
print help(open)

Les paramètres de la fonction open()

Elle prend en paramètre, le chemin (absolu ou relatif) menant au fichier à ouvrir et le mode d'ouverture. Le mode est donné sous la forme d'une chaîne de caractères. Voici les principaux modes :

  1. "r" en lecture (read)
  2. "w" en écriture (write)
  3. "a" en allongement (append)

Dans le mode "w", le fichier est créé automatiquement s’il n’existe pas.

Un premier exemple

In [ ]:
fic = open ( "data.txt" ,"r")

Comment obtenir le répertoire courant ?

In [ ]:
import os     #operating system
os.getcwd()   #c=current w=working d=directory

Comment modifier le répertoire de travail ?

In [ ]:
os.chdir("/home/cpge/.../cours/fichiers")

La modification est permanente, il n'est plus nécessaire d'indiquer le chemin du fichier lors de l'ouverture de celui-ci.

In [ ]:
fic = open ( "data.txt" ,"r")
print type(fic)

Lire les informations contenues dans un fichier

Trois modes de lecture des informations

  • read(max) : lire tout jusqu’à la fin du fichier (ou max caractères)
  • readline(max) : lire une ligne (ou max caractères)
  • readlines() : lire toutes les lignes jusqu’à la fin du fichier, le résultat est sous forme d’une liste de chaînes
In [ ]:
print  fic.read(20)
In [ ]:
print fic.read()

Le curseur de lecture reste positionné sur la valeur passée en paramètre. Pour le remettre au début on utilise la fonction seek()

In [ ]:
print help(fic.seek)
In [ ]:
fic.seek (0)
print fic.readline()
print fic.tell()
In [ ]:
print help(fic.tell)
In [ ]:
fic.seek(-17, 2)
print(fic.read())
In [ ]:
fic.seek(0)
print(fic.readlines())

Fermeture d'un fichier

Il est donc important de fermer les fichiers dès que vous ne les utilisez plus. Si le fichier reste ouvert, il peut ne pas être accessible par un autre programme.

L'attribut closed renvoie un booléen True si le fichier est fermé et False dans le cas contraire

In [ ]:
fic.closed

La fonction close() ferme définitivement le fichier

In [ ]:
fic.close()
print fic
print fic.closed

Écrire dans un fichier

Pour écrire dans un fichier, on utilise la méthode write(str) en lui passant en paramètre la chaîne à écrire dans le fichier.

In [ ]:
help (fic.write)
In [ ]:
f = open("test_ecriture.txt", "a")
f.write("Sauvegarde de mes données : \n")
f.close()

Mise en forme des données dans le fichier texte :

  • \n : pour le retour à la ligne
  • \t : pour la tabulation (la valeur par défaut est de 8), la valeur de tabulation peut être modifiée par la fonction expandtabs(val) d'un objet de type str

Les fichiers CSV

Pour exploiter les données collectées lors d’une expérience, elles doivent être enregistrées dans un format informatique ouvert. Ce type de format est en général proposé par tous les logiciels d’acquisition de données (Régressi, Latis Pro, Synchronie...) à travers un menu exporter sous le sigle de CSV. Un fichier CSV (Comma-Separated Values) est un fichier texte, par opposition aux formats dits binaires. Chaque ligne du texte correspond à une ligne du tableau et un délimiteur comme la virgule ou le point virgule correspondent aux séparations entre les colonnes. Les portions de texte séparées par une virgule correspondent ainsi aux contenus des cellules du tableau. La première ligne de ce fichier contient en général les titres de colonnes (grandeur mesurée en physique-chimie).

Exercices

Exercice 1 : Écrire une fonction $NbrLines$ qui a pour paramètre le nom d'un fichier (texte) et qui renvoie le nombre de lignes de ce fichier.

Exercice 2 : Écrire une fonction $countWords$ qui compte le nombre de mots contenu dans un fichier. On ajoutera un paramètre optionnel permettant de définir la longueur d'un mot.

Exercice 3 : Écrire une fonction $readBlock(filename, id1, id2)$ permettant d'afficher les lignes d’un fichier comprises dans l'intervalle [id1, id2]

Exercice 4 : Écrire une fonction $saveText$ qui sauvergarde le texte de votre choix dans un fichier dont l'utilisateur choisi le nom.

Exercice 5 : Écrire un fichier (exo5.csv) au format csv contenant les informations suivantes :

L,f

20,161

25,127

30,105

35,89.7

40,78.4

45,69.8

50,63.0

Exercice 6 : Écrire une fonction $readCSV$ qui renvoie les deux premières colonnes d'un fichier csv sous la forme d'objet de type ndarray

Exercice 7 : Des élèves de PC ont étudié le fonctionnement d'une biopile avec un citron. Pour ce faire ils ont eu besoin de :

  • tracer la caractéristique de leur biopile
  • et d'étudier une décharge complète de cette biopile.

Pour l'étude de la décharge les valeurs de la tension en fonction du temps sont enregistrées dans un fichier CSV (data.csv) de la manière suivante, chaque ligne (en dehors de la première) comporte 12 caractères plus le caractère de fin de ligne.

Exemple :

#Tension(V),Temps(min)
1.50;0000.00
1.50;0000.01
...
1.40;0010.00

  1. On suppose que chaque caractère est codé sur 8 bits. En ne tenant pas compte de la première ligne, déterminer le nombre d’octets correspondant à 10 minutes d’enregistrement à la fréquence d’échantillonnage de 2 Hz.
  2. En déduire le nombre approximatif (un ordre de grandeur suffira) d’octets contenus dans un fichier correspondant à 3 jours d'enregistrement. Temps nécessaire à une décharge à 90%
  3. Les élèves ont acheté une carte SD de 1Go, est-elle suffisante ?
  4. À l'aide la fonction précédente readCSV, proposer une suite d'instruction pour afficher le graphique de $U=f(t)$

Exercice 8: Des élèves se proposent de développer un logiciel écrit en Python fournissant une interface graphique spécialement conçue pour le traitement de données acquises lors de Mesures d’efforts de coupe en usinage. Une partie du travail consiste à analyser des données enregistrées lors de l'usinage dans un fichier CSV, de les affichées et de calculer une valeur moyenne.

  1. Écrire une fonction $rectangle\_data$ retournant une valeur approchée de l'intégrale du signal.
  2. Écrire une fonction $moyenne\_data$ retournant une valeur approchée de la moyenne du signal. On appelle valeur moyenne d'une fonction définie et continue sur l'intervalle [a, b] l'expression :
$$ \quad \bar{f}(x) = \frac{1}{b-a}\int_a^bf(x)\ dx$$

Corrections :

In [ ]:
def NbrLines(filename):
    fic = open(filename, "r")
    text = fic.readlines()
    fic.close()
    return len(text)
In [ ]:
NbrLines("fichiers/data.txt")
In [ ]:
def countWords(filename, delimiter, length = 1):  # length n'est pas implanté
    """
    filename  -> <str>  : le nom du fichier
    delimiter -> <list> : une liste des délimiteurs
    """
    fic = open(filename, "r")
    text = fic.read()
    eof = len(text)                    # eof = end of file
    words = 0
    for i in range(1, eof):
        if text[i] in delimiter:
            words += 1
    fic.close()
    return words
In [ ]:
countWords("fichiers/data.txt", [" ", "\n"])
In [ ]:
def readBlock(filename, id1, id2):
    '''
    On considère que la première ligne du fichier est id = 1
    filename -> String
    id1, id2 -> integer
    '''
    f = open(filename, "r")
    lines = f.readlines()
    debut, fin = id1-1, id2   # attention la liste démarre à avec l'indice zéro
    while debut < fin:
        print(lines[debut])
        debut += 1
    f.close()
In [ ]:
readBlock("data.txt", 2, 4)
In [ ]:
def saveText(filename, text):
    fic = open(filename, "w")
    fic.write(text)
    fic.close()
In [ ]:
saveText("fichiers/text1.txt","Les élèves de PCSI sont tous présents.\nMais ils sont très agités.")
In [ ]:
import numpy as np
def readCSV(filename, delimiter):
    fic = open(filename,"r")
    text = fic.readlines()
    XY = []
    for elt in text:
        if elt[0] != "#":
            elt = elt.replace("\n","")
            XY.append(elt.split(delimiter))
    XY = np.array(XY, dtype='float')
    fic.close()
    return XY[:,0], XY[:,1]
In [ ]:
U, t = readCSV("data.csv", ";")
In [ ]:
import matplotlib.pyplot as plt
%matplotlib inline
plt.plot(u, t, "-ob")
plt.xlabel("Temps en (s)")
plt.ylabel("U en (V)")
plt.grid()
plt.show()

Fin du cours sur les fichiers

Exploitation d’un fichier de données au format CSV

In [ ]:
import csv
print dir(csv)
In [ ]:
print help(csv.reader)

Exemple d'utilisation

In [ ]:
f = open("guitare.csv", "r")
lines = csv.reader(f, delimiter=";")
for l in lines:
    print l

Exemple 2: Écrire une fonction readCSV(filename, delim) qui prend en paramètre le nom du fichier au format CSV ainsi que le caractère de séparation des données et qui renvoie un tableau (liste de liste) du contenu du fichier. Les lignes précédées d'un caractère # devront être ignorées.

In [ ]:
def readCSV(filename, delim):
    f = open(filename, "r")
    tab = []
    lines = csv.reader(f, delimiter=delim)
    for l in lines:
        if l[0][0] != '#':
            tab.append(l)
    f.close()
    return tab
In [ ]:
tab = readCSV("guitare.csv", ";")
print tab

Exemple 3: Utilisation du fichier de données avec numpy

In [ ]:
import numpy as np
tab = np.array(tab, dtype=float)
print tab

Exemple 4: Lire un fichier au format CSV directement depuis numpy

In [ ]:
tab_numpy = np.loadtxt ( "guitare.csv" , delimiter = ';')
#tab_numpy = np.loadtxt ( "orage_utf8.txt")
print tab_numpy

Exemple 5 : Écrire une fonction saveData(file, tab, sep) permettant d'écrire dans un fichier les données stockées dans un tableau à deux dimensions avec un séparateur. Les données seront présentées avec la convention csv.

Création du tableau de données :

In [ ]:
from random import randint as rd
mes_donnees = [[rd(10,99) for col in range(6)] for line in range(5)]
print mes_donnees

Les données sont lues et enregistrées valeur par valeur, attention lors de l'écriture dans le fichier, il faut que les données soient de type String.

In [ ]:
def saveData(filename, tab, sep):
    f = open(filename+"csv", "w")
    line, col = len(tab), len(tab[0]) 
    for l in range(line):
        for c in range(col):
            if c != col-1:
                f.write((str(tab[l][c])+ sep + "\t").expandtabs(2))
            else:
                f.write(str(tab[l][c]) + "\n")
    f.close()
In [ ]:
saveData("saving_data", mes_donnees, ";")

Une autre façon de faire, cette fois c'est la totalité de la ligne que l'on écrit dans le fichier.

In [ ]:
def saveData(filename, tab):
    f = open(filename, "w")
    for line in tab:
        f.write(str(line))
        f.write('\n')
    f.close()
In [ ]:
saveData("saving_data", mes_donnees)
In [ ]:
import time
print time.strftime("Version du "+'%d/%m/%y %H:%M',time.localtime())

Christophe Casseau <a href=mailto:isncaju@gmail.com>mail : isncaju@gmail.com</a>

In [ ]:
import matplotlib.pyplot as plt
%matplotlib inline
import os
import csv
import numpy as np
os.chdir('/home/top/Documents/cours/cpge/notebook/cours/fichiers/')
In [ ]:
def readCSV(filename, delim):
    f = open(filename, "r")
    tab = []
    lines = csv.reader(f, delimiter=delim)
    for l in lines:
        tab.append(l)
    tab.pop(0)
    tab = np.asarray(tab, dtype='float')
    f.close()
    return tab

def graphCSV(tab, x_label, y_label, filename="fig.png"):
    plt.xlabel(x_label)
    plt.ylabel(y_label)
    plt.plot(tab[:,0], tab[:,3])
    plt.grid(b=True, which='major', color='k', linestyle='-')
    plt.grid(b=True, which='minor', color='r', linestyle='-', alpha=0.2)
    plt.minorticks_on()
    plt.savefig(filename, dpi=200)
    plt.show()


tab = readCSV("pendule3.csv", ",")
graphCSV(tab, "Temps (s)", u"Accélération $a_z$ (m.s$^{-2}$)", "pendule.png")

Periode : $T = \dfrac{t}{nb\_périodes}$

In [ ]:
def calcul_g(T, L):
    return (2*np.pi)**2*L/T**2
In [ ]:
T = 8.6 / 5

Période d'un pendule simple : $T = 2\pi\sqrt{\dfrac{l}{g}}$

on en déduit la valeur de l'accélération : $g = \dfrac{(2\pi)^2\times l}{T^2}$

In [ ]:
(2*np.pi)**2*0.74/T**2
In [ ]: