229

小さなファイルがたくさんあります。それらを 1 行ずつ読みたくありません。

Go にファイル全体を文字列変数に読み込む関数はありますか?

4

6 に答える 6

328

使用ioutil.ReadFile:

func ReadFile(filename string) ([]byte, error)

ReadFile は、filename で指定されたファイルを読み取り、内容を返します。呼び出しが成功すると、err == EOF ではなく、err == nil が返されます。ReadFile はファイル全体を読み取るため、Read からの EOF を報告するエラーとして扱いません。

[]byteの代わりにが得られますstring本当に必要な場合は変換できます。

s := string(buf)
于 2012-11-22T14:04:39.447 に答える
88

コンテンツをそのままにしたい場合string、簡単な解決策はパッケージのReadFile関数を使用することです。この関数は、簡単に に変換できるio/ioutilスライスを返します。bytesstring

package main

import (
    "fmt"
    "io/ioutil"
)

func main() {
    b, err := ioutil.ReadFile("file.txt") // just pass the file name
    if err != nil {
        fmt.Print(err)
    }

    fmt.Println(b) // print the content as 'bytes'

    str := string(b) // convert content to a 'string'

    fmt.Println(str) // print the content as a 'string'
}
于 2016-08-07T05:41:02.130 に答える
25

これらのファイルをすべて連結する効率が本当に気になる場合は、それらすべてを同じバイト バッファーにコピーするのが最善の方法だと思います。

buf := bytes.NewBuffer(nil)
for _, filename := range filenames {
  f, _ := os.Open(filename) // Error handling elided for brevity.
  io.Copy(buf, f)           // Error handling elided for brevity.
  f.Close()
}
s := string(buf.Bytes())

これにより、各ファイルが開かれ、その内容が buf にコピーされてから、ファイルが閉じられます。状況によっては、実際に変換する必要がない場合もあります。最後の行は、探しているデータが buf.Bytes() に含まれていることを示すためのものです。

于 2012-11-22T15:09:51.613 に答える