Reading a file line by line in Go

Clive B.
jump to solution

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

  • The Go bufio package
  • The Reader interface in the Go io package
  • The Open function in the Go os package
  • The Newline Wikipedia entry
Check if a Slice Contains a Value in Go
Clive B.
Converting an Int to a String in Go
Clive B.
Map Entries are Unaddressable
Evan Hicks
Deleting an element from a slice in Go
Clive B.

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.

Sentry