Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

[Golang] ファイル読み込みサンプル

More than 1 year has passed since last update.

はじめに

Golangのファイル読み込みをまとめました。バージョンは1.11.2で確認しました。

os.File Read使用

os.Openでファイルのオープンで取得したos.FileオブジェクトのReadメソッドを使用して読み込みを行います。
Readメソッドの引数に指定した[]byteスライスに内容が読み込まれます。

func useFileRead(fileName string) {
    fp, err := os.Open(fileName)
    if err != nil {
        panic(err)
    }
    defer fp.Close()

    buf := make([]byte, 64)
    for {
        n, err := fp.Read(buf)
        if n == 0 {
            break
        }
        if err != nil {
            panic(err)
        }
        fmt.Println(string(buf))
    }
}

ioutil.ReadFile使用

ioutil.ReadFileメソッドを使用してファイルを読み込みます。一度に全データを取得するのでファイルサイズが大きい場合は注意が必要ですが、記述量は少なくて済むのが利点です。

func useIoutilReadFile(fileName string) {
    bytes, err := ioutil.ReadFile(fileName)
    if err != nil {
        panic(err)
    }

    fmt.Println(string(bytes))
}

bufio.NewReaderSize使用

bufio.NewReaderSizeを使用してファイルを1行ごと読み込みます。1行のサイズが第二引数で指定したサイズを超える場合には、戻り値のisPrefixにfalseが返却されます。

func useBufioNewReaderSize(fileName string) {
    fp, err := os.Open(fileName)
    if err != nil {
        panic(err)
    }
    defer fp.Close()

    reader := bufio.NewReaderSize(fp, 64)
    var tmp []byte
    for {
        line, isPrefix, err := reader.ReadLine() // size を超えるとisPrefixがfalse
        if err == io.EOF {
            break
        }
        if err != nil {
            panic(err)
        }
        tmp = append(tmp, line...)
        if !isPrefix {
            fmt.Println(string(tmp))
            tmp = nil
        }
    }
}

bufio.NewScanner使用

bufio.NewScannerを使用してファイルを1行ごと読み込みます。bufio.NewReaderSizeを使用した場合と比べてシンプルに書けます。

func useBufioScanner(fileName string) {
    fp, err := os.Open(fileName)
    if err != nil {
        panic(err)
    }
    defer fp.Close()

    scanner := bufio.NewScanner(fp)
    for scanner.Scan() {
        fmt.Println(scanner.Text())
    }
}

csv.NewReader

csv.NewReaderを使用してcsvファイルを1行ごと読み込みます。csv.NewReaderを呼ぶとcsv.Readerが返却されます。csv.ReaderのCommaに区切り文字を指定すると指定した文字列でデータを分割します。デフォルトは","です。csv.ReaderのReaderメソッドを呼び出すと1行分の分割されたデータがスライスで返却されます。

func userCsvNewReader(fileName string) {
    fp, err := os.Open(fileName)
    if err != nil {
        panic(err)
    }
    defer fp.Close()

    reader := csv.NewReader(fp)
    //reader.Comma = ','
    reader.LazyQuotes = true
    for {
        record, err := reader.Read()
        if err == io.EOF {
            break
        } else if err != nil {
            panic(err)
        }
        fmt.Println(record)
    }
}
tchnkmr
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away