Introduction
La plupart des programmes ont besoin de lire des entrées à partir d'un emplacement quelconque. Cette section traite de l'accès aux fichiers.
This tutorial is from open-source community. Access the source code
💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici
La plupart des programmes ont besoin de lire des entrées à partir d'un emplacement quelconque. Cette section traite de l'accès aux fichiers.
Ouvrir un fichier.
f = open('foo.txt', 'rt') ## Ouvrir pour la lecture (texte)
g = open('bar.txt', 'wt') ## Ouvrir pour l'écriture (texte)
Lire tout le contenu.
data = f.read()
## Lire seulement jusqu'à 'maxbytes' octets
data = f.read([maxbytes])
Écrire du texte.
g.write('some text')
Fermer le fichier une fois terminé.
f.close()
g.close()
Il est important de fermer correctement les fichiers, mais il est facile d'oublier cette étape. Ainsi, l'approche préférée est d'utiliser l'instruction with
de cette manière.
with open(filename, 'rt') as file:
## Utiliser le fichier `file`
...
## Pas besoin de fermer explicitement
...instructions
Cela ferme automatiquement le fichier lorsque le contrôle quitte le bloc de code indenté.
Lire un fichier entier d'un coup sous forme de chaîne de caractères.
with open('foo.txt', 'rt') as file:
data = file.read()
## `data` est une chaîne de caractères contenant tout le texte de `foo.txt`
Lire un fichier ligne par ligne en itérant.
with open(filename, 'rt') as file:
for line in file:
## Traiter la ligne
Écrire des données sous forme de chaîne de caractères.
with open('outfile', 'wt') as out:
out.write('Hello World\n')
...
Rediriger la fonction print
.
with open('outfile', 'wt') as out:
print('Hello World', file=out)
...
Ces exercices dépendent d'un fichier portfolio.csv
. Le fichier contient une liste de lignes avec des informations sur un portefeuille d'actions. On suppose que vous travaillez dans le répertoire ~/project/
. Si vous n'êtes pas sûr, vous pouvez découvrir où Python pense qu'il est exécuté en faisant ceci :
>>> import os
>>> os.getcwd()
'/home/labex/project' ## Output vary
>>>
Tout d'abord, essayez de lire le fichier entier d'un coup sous forme d'une grande chaîne de caractères :
>>> with open('portfolio.csv', 'rt') as f:
data = f.read()
>>> data
'name,shares,price\n"AA",100,32.20\n"IBM",50,91.10\n"CAT",150,83.44\n"MSFT",200,51.23\n"GE",95,40.37\n"MSFT",50,65.10\n"IBM",100,70.44\n'
>>> print(data)
name,shares,price
"AA",100,32.20
"IBM",50,91.10
"CAT",150,83.44
"MSFT",200,51.23
"GE",95,40.37
"MSFT",50,65.10
"IBM",100,70.44
>>>
Dans l'exemple ci-dessus, il est important de noter que Python a deux modes d'affichage. Dans le premier mode où vous tapez data
à l'invite, Python vous montre la représentation brute de la chaîne de caractères, y compris les guillemets et les codes d'échappement. Lorsque vous tapez print(data)
, vous obtenez la sortie formatée réelle de la chaîne de caractères.
Bien que lire un fichier d'un coup soit simple, ce n'est souvent pas la manière la plus appropriée de le faire - surtout si le fichier est énorme ou si il contient des lignes de texte que vous voulez traiter une par une.
Pour lire un fichier ligne par ligne, utilisez une boucle for
comme ceci :
>>> with open('portfolio.csv', 'rt') as f:
for line in f:
print(line, end='')
name,shares,price
"AA",100,32.20
"IBM",50,91.10
...
>>>
Lorsque vous utilisez ce code tel qu'il est montré, les lignes sont lues jusqu'à la fin du fichier, auquel moment la boucle s'arrête.
Dans certains cas, vous pouvez vouloir lire ou sauter manuellement une seule ligne de texte (par exemple, peut-être que vous voulez sauter la première ligne d'en-têtes de colonnes).
>>> f = open('portfolio.csv', 'rt')
>>> headers = next(f)
>>> headers
'name,shares,price\n'
>>> for line in f:
print(line, end='')
"AA",100,32.20
"IBM",50,91.10
...
>>> f.close()
>>>
next()
renvoie la ligne de texte suivante dans le fichier. Si vous l'appeliez répétitivement, vous obtiendriez les lignes successives. Cependant, sachez que la boucle for
utilise déjà next()
pour obtenir ses données. Ainsi, vous ne l'appelleriez normalement pas directement, sauf si vous essayez d'explicitement sauter ou lire une seule ligne comme montré.
Une fois que vous lisez les lignes d'un fichier, vous pouvez commencer à effectuer plus de traitements, tels que le découpage. Par exemple, essayez ceci :
>>> f = open('portfolio.csv', 'rt')
>>> headers = next(f).split(',')
>>> headers
['name','shares', 'price\n']
>>> for line in f:
row = line.split(',')
print(row)
['"AA"', '100', '32.20\n']
['"IBM"', '50', '91.10\n']
...
>>> f.close()
Attention : Dans ces exemples, f.close()
est appelé explicitement car l'instruction with
n'est pas utilisée.
Maintenant que vous savez lire un fichier, écrivons un programme pour effectuer un calcul simple.
Les colonnes dans portfolio.csv
correspondent au nom de l'action, au nombre d'actions et au prix d'achat d'une seule position d'action. Écrivez un programme appelé pcost.py
dans le répertoire /home/labex/project
qui ouvre ce fichier, lit toutes les lignes et calcule combien il a coûté d'acheter toutes les actions du portefeuille.
Indice : pour convertir une chaîne de caractères en entier, utilisez int(s)
. Pour convertir une chaîne de caractères en nombre à virgule flottante, utilisez float(s)
.
Votre programme devrait afficher une sortie telle que la suivante :
Total cost 44671.15
Et si vous vouliez lire un fichier non texte, tel qu'un fichier de données compressé au format gzip? La fonction open()
intégrée ne vous aidera pas ici, mais Python a un module de bibliothèque gzip
qui peut lire les fichiers compressés au format gzip.
Essayez-le :
>>> import gzip
>>> with gzip.open('portfolio.csv.gz', 'rt') as f:
for line in f:
print(line, end='')
... regardez la sortie...
>>>
Remarque : Inclure le mode de fichier 'rt'
est crucial ici. Si vous l'oubliez, vous obtiendrez des chaînes d'octets au lieu de chaînes de caractères normales.
Les scientifiques de données sont rapides à souligner que des bibliothèques comme Pandas ont déjà une fonction pour lire des fichiers CSV. C'est vrai - et ça fonctionne assez bien. Cependant, ce n'est pas un cours sur l'apprentissage de Pandas. La lecture de fichiers est un problème plus général que les spécificités des fichiers CSV. La principale raison pour laquelle nous travaillons avec un fichier CSV est qu'il s'agit d'un format familier pour la plupart des programmeurs et qu'il est relativement facile à manipuler directement - illustrant de nombreuses fonctionnalités de Python dans le processus. Alors, n'hésitez pas à utiliser Pandas lorsque vous reprenez le travail. Pour le reste de ce cours cependant, nous allons nous en tenir à la fonctionnalité standard de Python.
Félicitations! Vous avez terminé le laboratoire de Gestion des Fichiers. Vous pouvez pratiquer d'autres laboratoires sur LabEx pour améliorer vos compétences.