Ajoute cours + améliorations code TP
This commit is contained in:
parent
59284c6d6a
commit
10a7469b05
4 changed files with 168 additions and 4 deletions
162
src/cours/CIEL1/01-bases-python/cours/python-bases-5-fichiers.md
Normal file
162
src/cours/CIEL1/01-bases-python/cours/python-bases-5-fichiers.md
Normal file
|
|
@ -0,0 +1,162 @@
|
|||
# Bases de Python - Partie 5 - Fichiers
|
||||
|
||||
Travailler avec des fichiers permet de stocker, récupérer ou manipuler des données en dehors du programme. Les fichiers peuvent être binaires ou composés de texte.
|
||||
|
||||
## Ouvrir un fichier
|
||||
|
||||
En Python, la fonction principale pour ouvrir un fichier est `open()`. Sa syntaxe générale est :
|
||||
|
||||
```python
|
||||
fichier = open('nom_du_fichier.txt', 'mode', encoding='utf-8')
|
||||
```
|
||||
|
||||
- `'nom_du_fichier.txt'` : nom ou chemin du fichier.
|
||||
- `'mode'` : représentation de l’action (voir ci-dessous).
|
||||
- `encoding='utf-8'` : gestion des caractères spéciaux, souvent essentiel en français. Si on ne précise pas, ce sera utf-8 par défaut, ce qui est recommandé.
|
||||
|
||||
|
||||
### Les modes d’ouverture de fichier
|
||||
|
||||
Le mode d'ouverture permet de savoir quelles actions vous souhaitez (et pourrez) faire avec votre fichier.
|
||||
|
||||
- `'r'` : lecture (read)
|
||||
- `'w'` : écriture (write) - écrase le contenu existant
|
||||
- `'a'` : ajout (append) - ajoute à la fin du fichier
|
||||
- `'x'` : création uniquement (erreur si le fichier existe)
|
||||
|
||||
```admonish example title="Exemple"
|
||||
~~~python
|
||||
fichier = open('exemple.txt', 'r', encoding='utf-8')
|
||||
~~~
|
||||
```
|
||||
|
||||
|
||||
## Fermer un fichier
|
||||
|
||||
Il est impératif de fermer un fichier après utilisation pour libérer les ressources du système. Si vous ne le faites pas vous vous exposez à des erreurs générées par le système d'exploitation (par exemple, trop de fichiers ouverts, ou fichier impossible à ouvrir car déjà utilisé ailleurs)
|
||||
|
||||
```python
|
||||
fichier.close()
|
||||
```
|
||||
|
||||
Une meilleure méthode consiste à utiliser le bloc `with` (qu'on appelle **gestionnaire de contexte**), qui gère automatiquement la fermeture:
|
||||
|
||||
```python
|
||||
with open('exemple.txt', 'r', encoding='utf-8') as fichier:
|
||||
contenu = fichier.read()
|
||||
```
|
||||
|
||||
|
||||
## Lire le contenu d’un fichier
|
||||
|
||||
### La meilleure méthode : boucle `for`
|
||||
|
||||
On peut directement parcourir le fichier avec une boucle `for`, ligne par ligne. Cette méthode est la plus simple et la plus propre : elle combine les avantages de `readline` (on ne charge pas tout le fichier en mémoire) et d'une boucle `for`, tout en ayant un code très facile à lire et comprendre.
|
||||
|
||||
```admonish example title="Exemple"
|
||||
~~~python
|
||||
with open('exemple.txt', 'r', encoding='utf-8') as fichier:
|
||||
for ligne in fichier:
|
||||
print(ligne)
|
||||
~~~
|
||||
```
|
||||
|
||||
### Lire tout d’un coup (read)
|
||||
|
||||
La méthode `read` renvoie tout le texte comme une seule chaîne de caractères. Sur des gros fichiers, on stocke tout le contenu en mémoire. Cela peut faire crasher votre programme si vous traitez des très gros fichiers.
|
||||
|
||||
```admonish example title="Exemple"
|
||||
~~~python
|
||||
with open('exemple.txt', 'r', encoding='utf-8') as fichier:
|
||||
texte = fichier.read()
|
||||
print(texte)
|
||||
~~~
|
||||
```
|
||||
|
||||
### Lire ligne par ligne (readlines)
|
||||
|
||||
La méthode `readlines` renvoie une liste de lignes. Chaque ligne est une chaîne de caractères. Même inconvénient qu'au dessus, mais plus facile à utiliser.
|
||||
|
||||
```admonish example title="Exemple"
|
||||
~~~python
|
||||
with open('exemple.txt', 'r', encoding='utf-8') as fichier:
|
||||
lignes = fichier.readlines()
|
||||
for ligne in lignes:
|
||||
print(ligne)
|
||||
~~~
|
||||
```
|
||||
|
||||
### Lire chaque ligne séparément (readline)
|
||||
|
||||
La méthode `readline` permet de lire la prochaine ligne du fichier, et donc de lire le fichier en le traitant ligne par ligne.
|
||||
On préfèrera l'utiliser sur des gros fichiers pour éviter de stocker tout le contenu dans la mémoire du programme.
|
||||
|
||||
```admonish example title="Exemple"
|
||||
~~~python
|
||||
with open('exemple.txt', 'r', encoding='utf-8') as fichier:
|
||||
ligne = None
|
||||
while ligne != "":
|
||||
ligne = fichier.readline()
|
||||
print(ligne)
|
||||
~~~
|
||||
```
|
||||
|
||||
## Écrire dans un fichier
|
||||
|
||||
Pour écrire, passez le mode `'w'` (ou `'a'`).
|
||||
|
||||
Puis utilisez la méthode
|
||||
- `write` pour écrire toute une chaîne ou un bloc binaire
|
||||
- `writelines` pour écrire une liste de lignes (attention, cette méthode n'ajoute pas automatiquement `\n` à la fin des lignes, à vous de le faire)
|
||||
|
||||
```admonish warning title="Attention"
|
||||
Avec `'w'` le contenu précédent est écrasé.
|
||||
```
|
||||
|
||||
```admonish example title="Exemple"
|
||||
~~~python
|
||||
with open('exemple.txt', 'w', encoding='utf-8') as fichier:
|
||||
fichier.write("Premier texte ajouté.\n")
|
||||
fichier.write("Une deuxième ligne.\n")
|
||||
~~~
|
||||
```
|
||||
|
||||
|
||||
### Ajouter à la fin (append, mode `'a'`)
|
||||
|
||||
Avec le mode append, vous ouvrez le fichier en mode écriture, mais vous n'effacez pas le contenu. Toute nouvelle écriture sera joutée à la fin du fichier.
|
||||
|
||||
```admonish example title="Exemple"
|
||||
~~~python
|
||||
with open('exemple.txt', 'a', encoding='utf-8') as fichier:
|
||||
fichier.write("\nUne nouvelle ligne ajoutée.")
|
||||
~~~
|
||||
```
|
||||
|
||||
## Notion de curseur
|
||||
|
||||
En Python, chaque fichier ouvert possède un curseur (ou pointeur) qui indique où l’action de lecture ou d’écriture va se produire dans le fichier.
|
||||
|
||||
Dès qu’un fichier est ouvert, la position initiale de ce curseur dépend du mode choisi :
|
||||
- il se place au début en lecture (mode `r`)
|
||||
- à la fin pour l’ajout (mode `a`)
|
||||
|
||||
Lors de la lecture ou de l’écriture, ce curseur avance automatiquement, ce qui permet de lire ou écrire à la suite.
|
||||
|
||||
Il est possible de manipuler manuellement la position du curseur grâce à deux méthodes principales :
|
||||
- `tell`, qui retourne la position actuelle du curseur dans le fichier
|
||||
- `seek(position)`, qui permet de déplacer le curseur à une position spécifique (en octets).
|
||||
|
||||
```admonish example title="Exemple"
|
||||
~~~python
|
||||
with open("exemple.txt", "r", encoding="utf-8") as fichier:
|
||||
fichier.tell() ## retourne la postion du curseur (normalement 0, vuqu'on vient juste d'ouvrir le fichier en mode "r")
|
||||
fichier.seek(0) ## Remet le curseur en position 0, c'est à dire au début du fichier. Peut servir à relire le fichier sans l'ouvrir ou le refermer
|
||||
~~~
|
||||
```
|
||||
|
||||
## Bonnes pratiques
|
||||
|
||||
- Toujours privilégier `with open(...) as ...` pour la robustesse. Cela évitera d'oublier de fermer le fichier (ou en cas d'erreur de ne pas pouvoir le fermer)
|
||||
- Utiliser `encoding='utf-8'`.
|
||||
- Pour les fichiers CSV, JSON ou autres formats, Python propose des modules dédiés (`csv`, `json`, ...).
|
||||
|
|
@ -50,6 +50,7 @@ Le tout dans un répertoire avec le nom suivant `YYYY-MM-DD_TPX_NOM1_Prenom1_NOM
|
|||
- Docs
|
||||
- Listes de mots en anglais
|
||||
- Listes de mots en français
|
||||
- Documentation de [`secrets.randbelow`](https://docs.python.org/3/library/secrets.html#secrets.randbelow), [`str.split`](https://docs.python.org/3/library/stdtypes.html#str.split), [`str.strip`](https://docs.python.org/3/library/stdtypes.html#str.strip)
|
||||
|
||||
## Étapes
|
||||
|
||||
|
|
|
|||
|
|
@ -13,11 +13,11 @@ ALPHABET = LETTRES + CHIFFRES + SPECIAL
|
|||
DICE_NB = 5
|
||||
|
||||
def get_words_from_file():
|
||||
file_path = Path("wordlist_en.txt")
|
||||
file_path = Path("bonus_wordlist_en.txt")
|
||||
with file_path.open('r') as file:
|
||||
lines = file.readlines()
|
||||
|
||||
words = {line.split("\t")[0].strip():line.split("\t")[1].strip() for line in lines}
|
||||
words = {}
|
||||
for line in file:
|
||||
words[line.split(" ")[0].strip()] = line.split(" ")[1].strip()
|
||||
return words
|
||||
|
||||
def generer_mdp(password_length = 14):
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@
|
|||
- [Cours - 2 - Structures de contrôle](./CIEL1/01-bases-python/cours/python-bases-2-structures-controle.md)
|
||||
- [Cours - 3 - Fonctions](./CIEL1/01-bases-python/cours/python-bases-3-fonctions.md)
|
||||
- [Cours - 4 - Structures de données](./CIEL1/01-bases-python/cours/python-bases-4-structuresdonnees.md)
|
||||
- [Cours - 5 - Fichiers](./CIEL1/01-bases-python/cours/python-bases-5-fichiers.md)
|
||||
- [TP1 - Générateur de mots de passe - Menu interactif](./CIEL1/01-bases-python/tp/TP_MDP01_menu.md)
|
||||
- [TP2 - Générateur de mots de passe - Fonctions et Modules](./CIEL1/01-bases-python/tp/TP_MDP02_fonctions.md)
|
||||
- [TP3 - Générateur de mots de passe - Listes et dictionnaires](./CIEL1/01-bases-python/tp/TP_MDP03_collections.md)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue