Loading...
Python

Fichiers

EISTI

Appuyer pour continuer.

Commandes pour les slides
  • et pour avancer / reculer.
  • espace pour avancer.
  • Ctrl/Command et + or - pour zoomer plus ou moins.
  • N pour afficher / cacher les notes.
  • H pour afficher l'aide.
Fichiers séquentiels
Ouverture
  • Ouverture d'un fichier : obFichier = open(cheminFichier, modeOuverture), renvoie un objet-fichier à manipuler
    • cheminFichier : Chemin absolu ou relatif
    • modeOuverture :
      • "r" lecture : le fichier doit exister, et la tête de lecture est en début de fichier
      • "w" écriture : crée ou écrase le fichier, et commence à écrire au début du fichier
      • "a" ajout : crée ou ouvre le fichier, et commence à écrire en fin de fichier
Fichiers séquentiels
Fermeture
  • Méthode : obFichier.close()
  • Assure la cohérence du fichier

Ecriture
  • Ouverture du fichier en écriture ou ajout
  • Méthode : obFichier.write(texte)
  • Ecrit texte dans le fichier (format : chaine de caractères)
Fichiers séquentiels
Lecture
  • Ouverture du fichier en lecture
  • Méthode : obFichier.read()
  • Lit les données présentes dans le fichier
  • Renvoie une chaîne de caractère, contenant la totalité du fichier
Fichiers séquentiels
Lecture
  • Ouverture du fichier en lecture
  • Méthode : obFichier.read(taille)
  • Lit les données présentes dans le fichier
  • Renvoie une chaîne de caractère, contenant les tailles caractères suivant à lire
  • S'il n'y a pas assez de caractères dans le fichier, la lecture s'arrête à la fin du fichier
  • Si la fin de fichier est atteinte : renvoie une chaîne vide
Fichiers séquentiels
Exemple - Ecriture
obFichier = open('MonFichier','a')
obFichier.write('Bonjour, fichier !')
obFichier.write("Quel beau temps, aujourd'hui !")
obFichier.close()
› cat MonFichier
Bonjour, fichier !Quel beau temps, aujourd'hui !
Fichiers séquentiels
Exemple - Lecture
obFichier = open('MonFichier', 'r')
t = obFichier.read()
print t
obFichier.close()
Bonjour, fichier !Quel beau temps, aujourd'hui !
Fichiers séquentiels
Exemple - Lecture
››› ofi = open('MonFichier','r')
››› t = ofi.read(7)
››› print t
'Bonjour'
››› t = ofi.read(5)
››› print t
', fic'
››› t = ofi.read(1000)
››› print t
"hier !Quel beau temps, aujourd'hui !"
››› t = ofi.read()
››› print t
''
››› ofi.close()
Fichiers texte
Présentation
  • C'est un fichier séquentiel qui contient des caractères imprimables
  • Organisés en en ligne successives, séparées par un caractère non imprimable appelé "marqueur de fin de ligne"
››› f = open('FichierTexte', 'w')
››› f.write('Ceci est la ligne un \nVoici la ligne deux\n')
››› f.write('Voici la ligne trois \nVoici la ligne quatre\n')
››› f.close()
  • Notez bien le marqueur de fin de ligne "\n" qui permet de séparer ligne par ligne
Fichiers texte
Lecture - readline()
  • Opérateur readline() extrait une ligne du fichier
  • Lit une ligne à la fois, en incluant le caractère de fin de ligne
››› f = open("FichierTexte","r")
››› ligne = f.readline()
››› print ligne
Ceci est la ligne un

››› ligne = f.readline()
››› print ligne
Voici la ligne deux

Fichiers texte
Lecture - readlines()
  • La méthode readlines() transfère toutes les lignes (restantes) dans une liste de chaînes
››› lignes = f.readlines()
››› print lignes
['Voici la ligne 3 \n','Voici la ligne quatre \n']
Fichiers texte
Lecture - Remarques
  • La liste retournée par readlines() apparaît en format brut, avec des apostrophes pour séparer les chaînes et les caractères spéciaux sous forme de codes
  • readlines() permet de lire un fichier dans son intégralité : ATTENTION pour les fichiers de grandes tailles, la mémoire vive de l'ordinateur peut ne pas supporter une telle quantitée de données à traiter
  • Dans le cas de la fin du fichier, readline() renvoie une chaîne vide, alors que readlines() renvoie une liste vide
Enregistrement et restitution de variables diverses
Fonctionnement général
  • L'argument de write() doit être une chaîne de caractères
  • Si on veut enregistrer un nombre, on doit d'abord le traduire en chaîne : str(n)
  • Problème : la lecture des données pour retranscrire correctement les données n'est pas assurée
Enregistrement et restitution de variables diverses
Exemple
››› a = 5
››› b = 2.83
››› c = 67
››› f = open('Monfichier','w')
››› f.write(str(a))
››› f.write(str(b))
››› f.write(str(c))
››› f.close()
››› f = open('Monfichier','r')
››› print f.read()
52.8367
››› f.close()
  • On a enregistré 3 valeurs numériques, comment les distinguer dans la chaîne lue ?
Enregistrement et restitution de variables diverses
Module pickle
  • Pickle signifie "conserver"
  • Enregistre les données en conservant leur type
  • Utilisation du module : import pickle
  • Ajout : pickle.dump(variable, fichier)
  • Récupération : variable = pickle.load(fichier)
Enregistrement et restitution de variables diverses
Exemple - Pickle
››› import pickle
››› a = 5
››› b = 2.83
››› c = 67
››› f = open('Monfichier','w')
››› pickle.dump(a, f)
››› pickle.dump(b, f)
››› pickle.dump(c, f)
››› f.close()
››› f = open('Monfichier','r')
››› t = pickle.load(f)
››› print t, type(t)
5 ‹type 'int'›
››› t = pickle.load(f)
››› print t, type(t)
2.83 ‹type 'float'›
››› t = pickle.load(f)
››› print t, type(t)
67 ‹type 'int'›
››› f.close()
Enregistrement et restitution de variables diverses
Pickle - Liste de variables
  • Transforme une liste en chaine, et vice-versa
  • Liste vers Chaîne : ch1 = pickle.dumps(liste)
  • Chaîne vers Liste : liste = pickle.loads(ch1)
››› ch1 = pickle.dumps([1, 2, 3])
››› print ch1
'(lp0\nI1\naI2\naI3\na.'
››› L = pickle.loads(ch1)
››› print L
[1, 2, 3]
Enregistrement comme structure
Module struct
  • Une structure permet de stocker plusieurs données ensemble, peu importe le type des données
  • Module struct permet d' "empaquetter" ou de "déparquetter" la structure en fonction d'un format donné.
  • Utilisation du module : import struct
  • Empaquetter : varString = struct.pack(format, a [, b ...])
  • Déparquetter : var = struct.unpack(format, varString)
  • Connaitre la taille de ce qui sera stocké : taille = struct.calcsize(format)
Enregistrement comme structure
Formats
CodeType
ccaractère
Bcaractère non signé (octet)
ientier (4 octets)
Ientier non signé (4 octets)
fflotant (4 octets)
ddouble (8 octets)

Liste complète des formats

format = 'ifid' # Contiendra : int, float, int, double
Enregistrement comme structure
Exemple - Struct
››› import struct
››› L = [3.14, 42.125, 121, 'A']
››› fmt = 'fdic'
››› data = struct.pack(fmt, L[0], L[1], L[2], L[3])
››› print data # Affiche la valeur en binaire
%G��%@H@E@yA
››› data # Chaine associée
'\xc3\xf5H@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10E@y\x00\x00\x00A'
››› f = open('Monfichier',"w")
››› f.write(data)
››› f.close()
››› f = open('Monfichier','r')
››› dim = struct.calcsize(fmt)
››› donnee = struct.unpack(fmt,f.read(dim))
››› print donnee
(3.140000104904175, 42.125, 121, 'A')
››› f.close()
Fichiers binaires
Présentation
  • Stock les données en binaire plutôt qu'en texte
  • Ouverture en écriture : f = open('chemin', "wb")
  • Ouverture en ajout : f = open('chemin', "ab")
  • Ouverture en lecture : f = open('chemin', "rb")
  • Fermeture : f.close()
Fichiers binaires
Présentation
  • Ecriture : f.write(donneeBinaire)
  • Lecture : donneeBinaire = f.read(taille)
  • Convertir les données en binaire : pickle, struct
Fichiers binaires
Exemple - Struct
# Importe le module
import struct
# Variables : un entier, un réel et une chaine
i = 10
x = 3.1415692
s = "ABCD"
# Ecriture dans le fichier
f = open("info.bin","wb")
f.write( struct.pack('i',i))
f.write( struct.pack('d',x))
f.write( struct.pack('cccc',*s))
f.close()
# Lecture depuis le fichier
f = open("info.bin","rb")
j = struct.unpack('i', f.read(4))
y = struct.unpack('d', f.read(8))
t = struct.unpack('cccc', f.read(4))
f.close()
# Affichage des données lues
print j, y, t # (10,) (3.1415692,) ('A', 'B', 'C', 'D')
Fichiers binaires
Exemple - Pickle
# Importe le module
import pickle
# Variables : un dictionnaire et une liste
dico = {'a':[1, 2.0, 3, "e"], 'b':('string',2), 'c': None}
liste = [1, 2, 3]
# Ecriture dans le fichier
f = open("data.bin","wb")
pickle.dump(dico, f)
pickle.dump(liste, f)
f.close()
# Lecture depuis le fichier
f = open("data.bin","rb")
d = pickle.load(f)
l = pickle.load(f)
f.close()
# Affichage des données lues
print d # {'a': [1, 2.0, 3, 'e'], 'c': None, 'b': ('string', 2)}
print l # [1, 2, 3]
Exception
Et si on ne connait pas la fin d'un fichier ? (1/2)
# Importe le module
import pickle
# Variable
data = {12:'douze', 'liste':list('toto'), 1.23: 4+5j, (1, 2, 3):'koko'}
# Ecriture dans le fichier
f = open("toto.txt","wb")
pickle.dump(data, f)
pickle.dump('une chaine', f)
pickle.dump(range(10), f)
pickle.dump(20, f)
pickle.dump(30, f)
f.close()
Exception
Et si on ne connait pas la fin d'un fichier ? (2/2)
# Lecture depuis le fichier
f = open("toto.txt","rb")
try :
        while True :
                a = pickle.load(f)
                print a
except EOFError : # Si on atteind la fin du fichier, une erreur est levée, et on la récupère
        print ('Fin du fichier atteinte')
f.close()
# Affichage obtenu
{'liste': ['t', 'o', 't', 'o'], 1.23: (4+5j), 12: 'douze', (1, 2, 3): 'koko'}
une chaine
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
20
30
Fin du fichier atteinte
Système des fichiers
Module os
  • Méthodes de traitement des fichiers
    • rename(nomActuelFichier, nouveauNomFichier)
    • remove(nomFichierASupprimer)
  • Méthodes de répertoire
    • mkdir(nouveauRepertoire)
    • rmdir(nomRepertoireASupprimer)
    • getcwd() : Affiche le répertoire courrant
    • listdir(nomRepertoire) : Liste les fichiers d'un répertoire