一尘不染

如何读取文本文件?

go

我正在尝试读取“file.txt”并使用 Golang 将内容放入变量中。这是我尝试过的…

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


阅读 298

收藏
2021-12-01

共1个答案

一尘不染

这取决于您要尝试做什么。

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.Readfrom的实现*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, try Scanner。AScanner在标记中读取您的文件:分隔符。

默认情况下,扫描仪通过换行符推进标记(当然,您可以自定义扫描仪如何标记您的文件,从这里学习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

    }
}
2021-12-01