Sentry Answers>Go>

Reading a file line by line in Go

Reading a file line by line in Go

Clive B.

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:

Click to Copy
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:

Click to Copy
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:

Click to Copy
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
  • SentryGo Error Tracking and Performance Monitoring (opens in a new tab)
  • Syntax.fmListen to the Syntax Podcast (opens in a new tab)
  • Syntax.fm logo
    Listen to the Syntax Podcast (opens in a new tab)

    Tasty treats for web developers brought to you by Sentry. Get tips and tricks from Wes Bos and Scott Tolinski.

    SEE EPISODES

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.