Des tableaux en texte
Un fichier CSV (valeurs séparées par des virgules) stocke un tableau en texte : une ligne par rangée, des cellules séparées par des virgules, souvent avec une ligne d'en-tête nommant les colonnes. Historiques de prix, carnets de transactions et exports de presque tous les outils prennent cette forme. On croit pouvoir l'analyser avec line.split(","), mais une cellule peut elle-même contenir une virgule ; elle est alors entourée de guillemets : AAPL,"Q3, adjusted". Découper à la main échoue dans ce cas : utilisez le module standard csv et ouvrez le fichier avec newline="" pour que les sauts de ligne dans les cellules soient bien gérés.
import csv
# Write a small table with csv.writer
with open("prices.csv", "w", newline="", encoding="utf-8") as file:
writer = csv.writer(file)
writer.writerow(["date", "symbol", "close", "note"])
writer.writerow(["2025-01-02", "AAPL", 184.25, "Q3, adjusted"])
writer.writerow(["2025-01-03", "AAPL", 185.5, ""])
# The comma inside the note is quoted for us
with open("prices.csv", encoding="utf-8") as file:
print(file.read().splitlines()[1]) # 2025-01-02,AAPL,184.25,"Q3, adjusted"Lire les lignes
csv.reader(file) produit chaque ligne comme une liste de chaînes. csv.DictReader(file) lit d'abord l'en-tête puis produit chaque ligne comme un dictionnaire indexé par nom de colonne, plus lisible et insensible à un changement d'ordre des colonnes. Dans les deux cas chaque cellule est du texte : convertissez avec float(...) ou int(...) avant de calculer. Passez delimiter=";" (ou "\t") pour les fichiers qui utilisent un autre séparateur.
import csv
# DictReader gives each row as a dict; cells are strings
closes = []
with open("prices.csv", newline="", encoding="utf-8") as file:
for row in csv.DictReader(file):
closes.append(float(row["close"]))
print(closes) # [184.25, 185.5]
# csv.reader gives plain lists, header included
with open("prices.csv", newline="", encoding="utf-8") as file:
rows = list(csv.reader(file))
print(rows[0]) # ['date', 'symbol', 'close', 'note']
print(rows[1]) # ['2025-01-02', 'AAPL', '184.25', 'Q3, adjusted']Écrire des lignes
csv.writer(file).writerow(values) écrit une ligne et met des guillemets quand c'est nécessaire ; les nombres sont convertis en texte pour vous. csv.DictWriter(file, fieldnames=[...]) écrit des dictionnaires, et writeheader() écrit d'abord les noms de colonnes. Ouvrez le fichier avec "w" et newline="" ; sans newline="", Windows peut produire des lignes vides entre les rangées.
import csv
# DictWriter: header first, then one dict per row
trades = [{"symbol": "AAPL", "quantity": 200}, {"symbol": "MSFT", "quantity": 50}]
with open("trades.csv", "w", newline="", encoding="utf-8") as file:
writer = csv.DictWriter(file, fieldnames=["symbol", "quantity"])
writer.writeheader()
writer.writerows(trades)
with open("trades.csv", encoding="utf-8") as file:
print(file.read().splitlines()) # ['symbol,quantity', 'AAPL,200', 'MSFT,50']import csv
# Cells are text until you convert them
with open("prices.csv", newline="", encoding="utf-8") as file:
row = next(csv.DictReader(file))
print(repr(row["close"]), row["close"] * 2) # '184.25' 184.25184.25
print(float(row["close"]) * 2) # 368.5
# Another separator: semicolons
with open("euro.csv", "w", newline="", encoding="utf-8") as file:
csv.writer(file, delimiter=";").writerow(["AAPL", "184,25"])
with open("euro.csv", newline="", encoding="utf-8") as file:
print(next(csv.reader(file, delimiter=";"))) # ['AAPL', '184,25']184.25, 200 et AAPL ne sont que des caractères tant qu'on ne les convertit pas. L'oublier donne "184.25" * 200 (le texte répété 200 fois) plutôt qu'une erreur. Convertissez chaque colonne une fois, là où vous la lisez, et vérifiez les noms de l'en-tête plutôt que de supposer des positions.- Ouvrez avec
newline=""; ne découpez ni n'assemblez les lignes CSV à la main. csv.DictReaderlit les lignes comme des dictionnaires ; chaque cellule est une chaîne.csv.writer/csv.DictWriterécrivent des lignes et mettent les guillemets pour vous.
À suivre : les données JSON, pour les enregistrements imbriqués qui ne tiennent pas dans un tableau plat.
Lab : ce qui est noté
- Regrouper les cours de clôture par symbole avec
read_closes25 pts - Enregistrer des transactions en CSV avec
write_trades25 pts - Totaliser la valeur échangée par symbole avec
total_by_symbol25 pts - Copier les lignes d'un symbole dans un nouveau fichier avec
filter_rows25 pts