Go でファイルや標準入力からテキストを一行ずつ読む

bufio.Scanner

Go言語 (golang) ではbufio.Scannerを使ってファイル/標準入力からテキストを一行ずつ読み込みます。 bufio.NewScanner*file.File から Scanner を作成し、Scan() がファイルの末尾に達してfalseを返すまで for ループを回します。 行の内容は Text()stirngとして取得できます。Text()の返り値の末尾には改行文字('\n')は含まれないので改行文字を削除するためにstrings.Trimを呼ぶ必要などもありません。 ファイルの終端に正常に到達したかを念の為に確かめたい場合は、s.Err()をチェックして下さい。 正常にファイルの末尾まで読み込まれた場合はs.Err()nilを返します。

func readLines(path string) {
    f, err := os.Open(path)
    if err != nil {
        log.Fatal(err)
        return
    }
    s := bufio.NewScanner(f)
    for s.Scan() {
        log.Print(strconv.Quote(s.Text()))
    }
    if s.Err() != nil {
        // non-EOF error.
        log.Fatal(s.Err())
    }
}

標準入力から読む

標準入力から文字列を読み込む場合は、os.Open(...)の代わりにos.Stdinを利用します。

func readLines(path string) {
    s := bufio.NewScanner(os.Stdin)
    for s.Scan() {
        log.Print(strconv.Quote(s.Text()))
    }
    if s.Err() != nil {
        // non-EOF error.
        log.Fatal(s.Err())
    }
}

bufio.Reader

bufio.Scannerの方がシンプルですが、bufio.Readerを使って一行ずつファイルを読むことも出来ます。 bufio.Readerを使う場合はReadLine()ではなくてReadString('\n')を使うという点に注意して下さい。 ReadString('\n')の返り値の末尾には改行文字'\n'が含まれるので必要ない場合はstrings.TrimLeftなどで改行文字を取り除く必要があります。

func readLines(f *file.File) {
    r := bufio.NewReader(f)
    for {
        // line includes '\n'.
        line, err := r.ReadString('\n')
        if err == io.EOF {
            break
        } else if err != nil {
            log.Fatal(err)
        }
        log.Print(strconv.Quote(line))
    }
}
最終更新: 8/4/2015