Ouvrir un fichier avec `with`
Les variables disparaissent quand le programme se termine ; les fichiers non. open(path, mode) donne un objet fichier, et mode indique ce que vous voulez : "r" pour lire (par défaut), "w" pour écrire et "a" pour ajouter. Ouvrez toujours les fichiers avec un bloc with : with open(path) as file:. À la fin du bloc, Python ferme le fichier pour vous, même en cas d'erreur, pour que les données ne soient ni perdues ni à moitié écrites. Passez encoding="utf-8" pour que le texte soit lu et écrit de la même façon sur tous les ordinateurs.
# Write a file, then read it back
with open("fills.txt", "w", encoding="utf-8") as file:
file.write("AAPL,184.25,200\n")
file.write("MSFT,410.20,50\n")
with open("fills.txt", encoding="utf-8") as file:
text = file.read()
print(repr(text)) # 'AAPL,184.25,200\nMSFT,410.20,50\n'Lire ligne par ligne
file.read() renvoie tout le fichier dans une seule chaîne. Le plus souvent on parcourt l'objet fichier, qui donne une ligne à la fois et fonctionne même pour des fichiers trop gros pour la mémoire : for line in file:. Chaque ligne se termine encore par \n : nettoyez-la avec line.strip(). Une ligne vide devient la chaîne vide "" après nettoyage, qui est fausse, donc if text: l'ignore. file.readlines() et text.splitlines() donnent des listes de lignes quand on les veut toutes d'un coup.
# Read line by line, skipping blank lines
with open("fills.txt", "a", encoding="utf-8") as file:
file.write("\n") # a blank line
total = 0.0
with open("fills.txt", encoding="utf-8") as file:
for line in file:
text = line.strip()
if not text:
continue
symbol, price, quantity = text.split(",")
total += float(price) * int(quantity)
print(round(total, 2)) # 57360.0Écrire et ajouter
file.write(text) écrit exactement la chaîne donnée et renvoie le nombre de caractères. Elle n'ajoute pas de saut de ligne : terminez chaque ligne par "\n" vous-même. Le mode "w" vide d'abord le fichier (et le crée s'il n'existe pas) : ouvrir un fichier existant avec "w" jette son ancien contenu. Le mode "a" conserve l'existant et ajoute à la fin. On ne peut écrire que des chaînes : convertissez d'abord les nombres, par exemple avec une f-string comme f"{price:.2f}".
# "w" starts over, "a" adds to the end
with open("log.txt", "w", encoding="utf-8") as file:
file.write("start\n")
with open("log.txt", "a", encoding="utf-8") as file:
file.write("order 1 filled\n")
file.write(f"pnl {12.5:+.2f}\n")
with open("log.txt", encoding="utf-8") as file:
print(file.read().splitlines()) # ['start', 'order 1 filled', 'pnl +12.50']
with open("log.txt", "w", encoding="utf-8") as file:
pass # opening with "w" emptied it
with open("log.txt", encoding="utf-8") as file:
print(repr(file.read())) # ''Chemins et fichiers absents
Un chemin relatif comme "fills.txt" est cherché dans le dossier courant du programme ; utilisez os.path.join(folder, name) pour construire des chemins sans se soucier des séparateurs. Ouvrir en lecture un fichier inexistant lève FileNotFoundError, que l'on peut intercepter avec try/except quand l'absence est un cas attendu. Pour les petits fichiers, pathlib.Path(path).read_text() et .write_text(text) ouvrent, lisent ou écrivent et ferment en un seul appel.
import os
from pathlib import Path
# A missing file is an exception you can handle
def count_lines(path):
try:
with open(path, encoding="utf-8") as file:
return len(file.read().splitlines())
except FileNotFoundError:
return 0
print(count_lines("fills.txt")) # 3
print(count_lines("nope.txt")) # 0
# pathlib does open + read + close in one call
path = Path(os.path.join(".", "fills.txt"))
print(path.read_text(encoding="utf-8").splitlines()[0]) # AAPL,184.25,200"w" sur le mauvais chemin détruit des données sans retour possible. Choisissez un format simple (un enregistrement par ligne, champs séparés par des virgules) et écrivez ensemble le lecteur et l'écrivain pour qu'ils soient d'accord. Vous allez bientôt rencontrer le format CSV, qui formalise exactement cette idée.with open(path, mode, encoding="utf-8") as file:ouvre le fichier et le ferme toujours.for line in file:lit une ligne à la fois ;line.strip()retire le saut de ligne."w"vide le fichier,"a"ajoute ;writen'ajoute pas de saut de ligne.
À suivre : les fichiers CSV, la façon standard de stocker des tableaux de prix et de transactions.
Lab : ce qui est noté
- Charger une liste de suivi depuis un fichier avec
read_symbols25 pts - Transformer un fichier d'exécutions en tuples avec
parse_trades25 pts - Enregistrer un rapport de gains et pertes avec
write_report25 pts - Ajouter à un journal sans le perdre avec
append_lines25 pts