1. ホーム
  2. go

[解決済み] テキストファイルの読み方を教えてください。重複

2022-11-25 21:16:30

質問

私はGolangを使って、"file.txt"を読み込んで、その内容を変数に格納しようとしています。以下は私が試したことです...

package main

import (
    "fmt"
    "os"
    "log"
)

func main() {
    file, err := os.Open("file.txt")
    if err != nil {
        log.Fatal(err)
    }

    fmt.Print(file)
}

ファイルが正常に読み込まれ os.Open の型を返します。 *os.ファイル

どのように解決するのですか?

何をしようとしているかによります。

file, err := os.Open("file.txt")
fmt.print(file)

&{0xc082016240} と出力されるのは、ファイルディスクリプタのポインタの値を出力しているからです( *os.File ) のポインタの値を表示しているためで、ファイルの内容を表示しているわけではありません。ファイルの内容を取得するには、次のようにします。 READ をファイル記述子から取得します。


ファイルの内容をすべて(バイト単位で)メモリに読み込む。 ioutil.ReadAll

package main

import (
    "fmt"
    "io/ioutil"
    "os"
    "log"
)

func main() {
    file, err := os.Open("file.txt")
    if err != nil {
        log.Fatal(err)
    }
    defer func() {
        if err = file.Close(); err != nil {
            log.Fatal(err)
        }
    }()


  b, err := ioutil.ReadAll(file)
  fmt.Print(b)
}

しかし、ファイルサイズが大きい場合、バッファサイズ分のチャンクを読み込む方がメモリ効率が良い場合があります。 io.Reader.Read から *os.File

func main() {
    file, err := os.Open("file.txt")
    if err != nil {
        log.Fatal(err)
    }
    defer func() {
        if err = file.Close(); err != nil {
            log.Fatal(err)
        }
    }()


    buf := make([]byte, 32*1024) // define your buffer size here.

    for {
        n, err := file.Read(buf)

        if n > 0 {
            fmt.Print(buf[:n]) // your read buffer.
        }

        if err == io.EOF {
            break
        }
        if err != nil {
            log.Printf("read %d bytes: %v", n, err)
            break
        }
    }

}

その他、標準のutilパッケージも利用できます。 bufio 試しに Scanner . A Scanner はトークンであるセパレータでファイルを読み取ります。

デフォルトでは、スキャナはトークンを改行で進めます(もちろん、スキャナがファイルをトークン化する方法をカスタマイズすることができます。 bufioテスト ).

package main

import (
    "fmt"
    "os"
    "log"
    "bufio"
)

func main() {
    file, err := os.Open("file.txt")
    if err != nil {
        log.Fatal(err)
    }
    defer func() {
        if err = file.Close(); err != nil {
            log.Fatal(err)
        }
    }()

    scanner := bufio.NewScanner(file)

    for scanner.Scan() {             // internally, it advances token based on sperator
        fmt.Println(scanner.Text())  // token in unicode-char
        fmt.Println(scanner.Bytes()) // token in bytes

    }
}

最後に、この素晴らしいサイトも参考にしたいと思います。 go-langファイルのチートシート . これはgo-langでのファイル操作に関連するほとんどすべてのことを網羅しているので、役に立つと思います。