Lire un fichier ligne par ligne en Go : meilleures pratiques 2025

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Lire un fichier ligne par ligne en Go : du débutant au pro en 2025

\n\n

Avez-vous déjà réfléchi à la manière de lire efficacement d'énormes fichiers journaux ou de traiter des données CSV en Go ? Si oui, vous êtes au bon endroit. Le sujet de la lecture d'un fichier ligne par ligne est l'un des plus populaires sur Stack Overflow, et ce n'est pas un hasard. Go nous offre des outils puissants, mais choisir la bonne approche n'est parfois pas simple.

\n\n

Dans cet article, nous ne montrerons pas simplement comment lire des lignes à partir d'un fichier. Nous analyserons les meilleures pratiques de 2025 : du rapide bufio.Scanner aux solutions tamponnées personnalisées. Vous apprendrez à éviter les pièges (par exemple, les lignes de plus de 64 Ko), à gérer correctement les erreurs et à accélérer le travail avec de gros volumes de données.

\n\n

Prêts ? C'est parti !

\n\n

Pourquoi lire des lignes n'est pas simplement « prendre et lire » ?

\n\n

En Go, il existe plusieurs façons de lire des fichiers, et chacune correspond à une tâche spécifique. Certains utilisent ioutil.ReadFile (d'ailleurs, depuis Go 1.16, il est déprécié), d'autres utilisent os.File avec un tampon. Mais pour le traitement ligne par ligne, le roi est bufio.Scanner.

\n\n

Pourquoi ? Parce qu'il est :

\n
    \n
  • Efficace en mémoire — il ne charge pas tout le fichier dans la RAM
  • \n
  • Simple à utiliser — un minimum de code
  • \n
  • Capable de gérer les erreurs — il vérifie chaque étape
  • \n
\n\n

Mais il y a un détail : le tampon standard de Scanner est de 64 Ko. Si votre ligne est plus longue, vous obtiendrez une erreur. Pour ces cas, d'autres approches sont nécessaires.

\n\n

Exemple de base : bufio.Scanner

\n\n

Commençons par la méthode la plus courante. Voici un code fonctionnel minimal :

\n\n
package main\n\nimport (\n    "bufio"\n    "fmt"\n    "log"\n    "os"\n)\n\nfunc main() {\n    file, err := os.Open("data.txt")\n    if err != nil {\n        log.Fatal(err)\n    }\n    defer file.Close()\n\n    scanner := bufio.NewScanner(file)\n    for scanner.Scan() {\n        line := scanner.Text()\n        fmt.Println(line)\n    }\n\n    if err := scanner.Err(); err != nil {\n        log.Fatal(err)\n    }\n}\n
\n\n

Qu'est-ce qui est important ici ?

\n
    \n
  • defer file.Close() — nous fermons le fichier même en cas de panique
  • \n
  • scanner.Text() — retourne la ligne sans le caractère de nouvelle ligne (\\n)
  • \n
  • scanner.Err() — nous vérifions s'il n'y a pas eu d'erreurs pendant la lecture
  • \n
\n\n

Ce code est idéal pour 90 % des tâches : fichiers de configuration, journaux, petits CSV.

\n\n

Le problème des longues lignes : augmenter le tampon

\n\n

Imaginez : vous lisez un fichier avec des lignes JSON de 100 Ko. Scanner échouera avec l'erreur bufio.Scanner: token too long. La solution est d'augmenter le tampon :

\n\n
scanner := bufio.NewScanner(file)\nbuf := make([]byte, 0, 1024*1024) // 1 Mo\nscanner.Buffer(buf, 10*1024*1024) // maximum 10 Mo par ligne\n\nfor scanner.Scan() {\n    // ... traitement\n}\n
\n\n

Important : le deuxième paramètre est la taille maximale de la ligne. Si la ligne est plus grande, nouvelle erreur. Choisissez avec une marge, mais pas gigantesque — la mémoire n'est pas extensible.

\n\n

Quand Scanner ne convient pas : alternatives

\n\n

Malgré sa popularité, bufio.Scanner n'est pas universel. Voici deux cas où il faut envisager une autre approche :

\n\n

1. Fichiers énormes (gigaoctets)

\n

Si le fichier est plus grand que la mémoire disponible (rare, mais ça arrive), Scanner reste bon. Mais si vous devez lire des données binaires ou traiter des lignes avec des séparateurs personnalisés, il est préférable d'utiliser bufio.Reader :

\n\n
reader := bufio.NewReader(file)\nfor {\n    line, err := reader.ReadString('\\n')\n    if err != nil {\n        break\n    }\n    // line contient \\n à la fin\n    line = strings.TrimRight(line, "\\n")\n    fmt.Println(line)\n}\n
\n\n

Avantage : vous contrôlez chaque opération de lecture. Inconvénient : plus de code et un risque d'erreurs plus élevé.

\n\n

2. Traitement sans chargement en mémoire

\n

Parfois, il suffit de compter les lignes ou de trouver un motif. Pour cela, bufio.Scanner convient

Blogs

Book Recommendations