Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| dev:python:manipulation-de-fichiers [2020/11/20 07:37] – yoann | dev:python:manipulation-de-fichiers [2021/02/01 21:51] (Version actuelle) – modification externe 127.0.0.1 | ||
|---|---|---|---|
| Ligne 9: | Ligne 9: | ||
| - | ===== Ouvrir | + | ===== Écrire du texte dans un fichier ===== |
| Pour lire et écrire du texte dans les fichiers, il faut spécifier correctement l' | Pour lire et écrire du texte dans les fichiers, il faut spécifier correctement l' | ||
| Ligne 16: | Ligne 16: | ||
| file = open('/ | file = open('/ | ||
| for cpt in range(100): | for cpt in range(100): | ||
| - | | + | |
| - | | + | |
| + | # l' | ||
| file.close() | file.close() | ||
| </ | </ | ||
| + | ===== Lire un fichier texte ===== | ||
| + | |||
| + | En python les fichiers sont des itérateur: ils peuvent être directement intégrés à une boucle for: | ||
| + | <code python> | ||
| + | file = open('/ | ||
| + | for line in file: | ||
| + | # le fichier est parcouru ligne par ligne | ||
| + | # transformer la str en liste | ||
| + | line = line.split() | ||
| + | # la liste étant mutable on peut effectuer nos traitements | ||
| + | ... | ||
| + | | ||
| + | file.close() | ||
| + | </ | ||
| ===== Le context manager ===== | ===== Le context manager ===== | ||
| + | |||
| + | Le code précédent ne garantit pas que la ressource fichier soit bien libérée: exception à l’exécution ou oubli d' | ||
| <code python> | <code python> | ||
| - | with open(' | + | with open('/path/to/filename.txt' |
| - | for line in fp: | + | # bloc d' |
| + | for line in file: | ||
| print line | print line | ||
| </ | </ | ||
| + | |||
| + | ===== Ecrire un flux binaire dans un fichier ===== | ||
| + | |||
| + | <code python> | ||
| + | with open('/ | ||
| + | # bloc d' | ||
| + | for line in range(100): | ||
| + | file.write(b' | ||
| + | # l' | ||
| + | # c = 0xff.to_bytes(1, | ||
| + | </ | ||
| + | |||
| + | Pour vérifier le contenu du fichier, on peut utiliser **od**: | ||
| + | <code bash> | ||
| + | #affiche le flux par valeurs hexadécimales de 1 octet interprétation des valeurs | ||
| + | # en little endian | ||
| + | od --address-radix=d --width=10 --output-duplicates --format=x1 --endian=little / | ||
| + | 0000000 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 | ||
| + | 0000010 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 | ||
| + | 0000020 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 | ||
| + | 0000030 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 | ||
| + | 0000040 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 | ||
| + | 0000050 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 | ||
| + | 0000060 | ||
| + | </ | ||
| + | |||
| + | ===== Les modes d' | ||
| + | |||
| + | Les modes les plus utilisés: | ||
| + | |||
| + | ^ Mode ^ Description | ||
| + | | " | ||
| + | | " | ||
| + | | " | ||
| + | |||
| + | Le détail des modes d' | ||
| + | |||
| + | ===== Méthodes bas niveau ===== | ||
| + | |||
| + | ==== Méthode read() ==== | ||
| + | |||
| + | La méthode **read()** permet de lire dans un fichier un buffer d'une taille choisit. Si la taille du buffer n'est pas spécifiée, | ||
| + | <code python> | ||
| + | with open('/ | ||
| + | # bloc d' | ||
| + | all_content = file.read() | ||
| + | print(f" | ||
| + | </ | ||
| + | |||
| + | <code python> | ||
| + | with open('/ | ||
| + | # bloc d' | ||
| + | for bloc in range(10): | ||
| + | #lecture par bloc de 4 caractères | ||
| + | print(f" | ||
| + | </ | ||
| + | |||
| + | ==== Méthode flush() ==== | ||
| + | |||
| + | Pour des raisons de performances, | ||
| + | |||
| + | ===== Le module pathlib ===== | ||
| + | |||
| + | Pour opérer sur les chemins, nom de fichiers présents sur l' | ||
| + | |||
| + | On utilisera plutôt **pathlib**: | ||
| + | |||
| + | <code python> | ||
| + | filename = '/ | ||
| + | |||
| + | from pathlib import Path | ||
| + | |||
| + | path = Path(filename) | ||
| + | |||
| + | # retourne True si le fichier existe | ||
| + | path.exists() | ||
| + | |||
| + | # retourner un tuple contenant entre autre propriétaire, | ||
| + | path.stat() | ||
| + | file_size = path.stat().st_size() | ||
| + | |||
| + | # Détruire un fichier: | ||
| + | path.unlink() | ||
| + | |||
| + | # rechercher des fichiers | ||
| + | dirpath = Path(' | ||
| + | |||
| + | for files in dirpath.glob(" | ||
| + | | ||
| + | </ | ||
| + | |||
| + | ===== Formats ===== | ||
| + | |||
| + | Lors de l' | ||
| + | |||
| + | JSON s'est popularisé car il est léger, permet de communiquer avec des applications web en JavaScript et qu'il est supporté par de nombreux langage. Il permet de sérialiser facilement la plupart des types de base: | ||
| + | |||
| + | <code python> | ||
| + | dataset = [10, | ||
| + | ' | ||
| + | | ||
| + | | ||
| + | # les tuples seront convertis en listes | ||
| + | | ||
| + | ] | ||
| + | |||
| + | # Ecrire dans un fichier au format JSON | ||
| + | with open("/ | ||
| + | json.dump(dataset, | ||
| + | |||
| + | del(dataset) | ||
| + | |||
| + | # Relire, récupérer des données au format JSON | ||
| + | with open("/ | ||
| + | dataset = json.load(json_input) | ||
| + | |||
| + | dataset | ||
| + | [10, | ||
| + | 33, | ||
| + | ' | ||
| + | [2.5, 3.1], | ||
| + | | ||
| + | [2, 3, 4]] | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | Les données une fois rechargées ne comportent plus le tuple initial, il a été remplacé par une liste équivalente. Certains types de base Python non natif en JavaScript ne sont pas supportés par JSON: tuple, complex, set, frozenset | ||
| + | </ | ||
| + | |||
| + | Le module **pickle** offre un format proche de JSON intégrant les types de base et permettant de faire des sauvegardes locales d' | ||
| + | |||
| + | ===== Entrées sorties standards ===== | ||
| + | |||
| + | Les fichiers d' | ||
| + | <code python> | ||
| + | import sys | ||
| + | for channel in (sys.stdin, sys.stdout, sys.stderr): | ||
| + | print(channel, | ||
| + | </ | ||
| + | |||
| + | Comme sys.stdout est une variable du module sys référençant un objet fichiere, on peut lui faire référencer un autre fichier et rediriger ainsi les sorties. | ||
| + | |||
| ===== Références ===== | ===== Références ===== | ||