Reading a file line by line in Go
The Problem
I don’t know how to read a file line by line in Go.
The Solution
In Go, you can use the bufio.Scanner function, which accepts an io.Reader interface, to read lines separated by a newline.
Files opened using os.Open satisfy the io.Reader interface.
The following code prints file contents line by line:
package main
import (
"bufio"
"fmt"
"log"
"os"
)
func main() {
file, err := os.Open("/path/to/file.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
// This will print the file contents line by line.
fmt.Println(scanner.Text())
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
}
Advanced Usage
If you want to scan through a file and split its contents by something other than newlines, you can specify a custom split function. Go supplies a few custom split functions in the standard library, namely bufio.ScanBytes, bufio.ScanLines, bufio.ScanRunes, and bufio.ScanWords.
For example, you can split a text by spaces so that each space-separated word is printed individually:
package main
import (
"bufio"
"bytes"
"fmt"
"log"
)
func main() {
words := bytes.NewReader([]byte("This is some example text."))
scanner := bufio.NewScanner(words)
scanner.Split(bufio.ScanWords)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
}
This prints:
This
is
some
example
text.
Further Reading
Considered "not bad" by 4 million developers and more than 150,000 organizations worldwide, Sentry provides code-level observability to many of the world's best-known companies like Disney, Peloton, Cloudflare, Eventbrite, Slack, Supercell, and Rockstar Games. Each month we process billions of exceptions from the most popular products on the internet.