Le stockage des données : variables, fichiers, bases de données
Jusqu’à présent, nous avons utilisé des variables pour stocker des données sous forme de chaines, de listes, de dictionnaires, etc.
Les variables sont très pratiques car elles vont nous permettre de manipuler nos données très facilement en Python. Cependant, elles ne vont pas toujours être les outils les mieux adaptés pour stocker des données.
En effet, le gros “défaut” des variables est qu’elles ne peuvent stocker une information que temporairement (au mieux le temps de l’exécution d’un script).
Or, dans certains cas, on aimerait enregistrer des informations de manière définitives, notamment lorsqu’il s’agit d’informations envoyées par les utilisateurs.
De plus, les variables ne sont pas adaptées pour le stockage de nombreuses données.
En programmation, pour stocker des informations de manière définitive, on va pouvoir soit enregistrer ces informations dans des fichiers, soit les enregistrer dans des bases de données.
De manière générale, les bases de données sont plus puissantes et plus performantes que le recours aux fichiers pour stocker des informations mais la gestion d’une base de données est beaucoup plus complexe que l’utilisation de fichiers.
Nous utiliserons donc les fichiers pour des programmes aux ambitions plus modestes et lorsqu’on n’aura pas de trop grosses quantités d’informations à stocker et au contraire les bases de données lorsque le besoin d’une structure plus robuste se fera sentir.
Ouvrir un fichier en Python avec fopen()
Nous allons pouvoir effectuer toutes sortes de manipulations sur nos fichiers en Python : création d’un fichier, lecture des données, écriture, etc. Pour réaliser ces opérations, il va cependant avant tout falloir ouvrir le fichier. Pour cela, on utilise la fonction fopen()
.
La fonction fopen()
renvoie un objet de type “fichier” (type file
en anglais). Cette fonction nous permet d’ouvrir un fichier pour y réaliser différentes opérations.
On va passer deux arguments à la fonction fopen()
: le nom du fichier à ouvrir et le mode d’ouverture (qui est par défaut r
). Ce mode d’ouverture va conditionner les opérations qui vont pouvoir être faites sur le fichier par la suite. Les modes d’ouverture les plus utilisés et qui vont nous intéresser sont les suivants :
Mode d’ouverture | Description |
---|---|
r | Ouvre un fichier en lecture seule. Il est impossible de modifier le fichier. Le pointeur interne est placé au début du fichier. |
r+ | Ouvre un fichier en lecture et en écriture. Le pointeur interne est placé au début du fichier. |
a | Ouvre un fichier en écriture seule en conservant les données existantes. Le pointeur interne est placé en fin de fichier et les nouvelles données seront donc ajoutées à la fin. Si le fichier n’existe pas, le crée. |
a+ | Ouvre un fichier en lecture et en écriture en conservant les données existantes. Le pointeur interne est placé en fin de fichier et les nouvelles données seront donc ajoutées à la fin. Si le fichier n’existe pas, le crée. |
w | Ouvre un fichier en écriture seule. Si le fichier existe, les informations existantes seront supprimées. S’il n’existe pas, crée un fichier. |
w+ | Ouvre un fichier en lecture et en écriture. Si le fichier existe, les informations existantes seront supprimées. S’il n’existe pas, crée un fichier. |
Notez qu’on va également pouvoir rajouter une autre lettre derrière le mode pour définir si le fichier doit être ouvert en mode texte (lettre t
, valeur par défaut ou en mode binaire (lettre b
). Dans ce cours, nous nous concentrerons sur le mode texte et n’aborderons pas le mode binaire, généralement moins utilisé.
Fermer un fichier
Une fois qu’on a terminé de manipuler un fichier, il est considéré comme une bonne pratique de le fumer. Cela évite d’utiliser des ressources inutilement et d’obtenir certains comportements inattendus.
Pour fermer un fichier, on peut soit utiliser la méthode close()
soit idéalement ajouter le mot clef with
avant open()
lors de l’ouverture du fichier qui garantira que le fichier sera fermé automatiquement une fois les opérations terminées.
La position du curseur interne ou pointeur
Avant d’aller plus loin dans la manipulation de fichier, il faut que je vous parle de la position du curseur (ou « pointeur de fichier ») car celle-ci va impacter le résultat de la plupart des manipulations qu’on va pouvoir effectuer sur les fichiers. Il est donc essentiel de toujours savoir où se situe ce pointeur et également de savoir comment le bouger.
Le curseur ou pointeur est l’endroit dans un fichier à partir duquel une opération va être faite. Pour donner un exemple concret, le curseur dans un document Word, dans un champ de formulaire ou lorsque vous effectuez une recherche Google ou tapez une URL dans votre navigateur correspond à la barre clignotante.
Ce curseur indique l’emplacement à partir duquel vous allez écrire votre requête ou supprimer un caractère, etc. Le curseur dans les fichiers va être exactement la même chose à la différence qu’ici on ne peut pas le voir visuellement.
Le mode d’ouverture choisi va être la première chose qui va influer sur la position du pointeur. En effet, selon le mode choisi, le pointeur de fichier va se situer à une place différente. Ensuite, il faut savoir que certaines méthodes vont déplacer ce curseur lors de leur exécution, comme les méthodes de lecture du fichier par exemple.
Pour connaitre la place du pointeur interne dans un fichier et déplacer ce pointeur, nous allons pouvoir utiliser les méthodes tell()
et seek()
.
La méthode tell()
renvoie la position du pointeur interne. La méthode seek()
permet de repositionner ce pointeur.
La méthode fseek()
prend deux arguments : le premier argument indique de combien ou souhaite décaler le curseur interne tandis que le second argument indique le point de référence à partir d’où décaler le pointeur. Ce point de référence peut être soit égal à 0 pour le début du fichier, 1 pour la position actuelle ou 2 pour la fin du fichier.
Cependant, lorsque le fichier est ouvert en mode texte, la méthode seek()
ne va nous offrir que des possibilités limitées.
Entre autre, seek()
ne va accepter comme valeur de décalage que 0 ou la valeur renvoyée par tell()
et le point de référence ne pourra être que le début ou la fin du fichier.