Golang:如何阅读文本文件?

Aci*_*dic 80 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)
}
Run Code Online (Sandbox Code Playgroud)

文件被成功读取,os.Open的返回返回一个*os.File类型

Roy*_*Lee 66

这取决于你想要做什么.

file, err := os.Open("file.txt")
fmt.print(file)
Run Code Online (Sandbox Code Playgroud)

它输出&{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 file.Close()


  b, err := ioutil.ReadAll(file)
  fmt.Print(b)
}
Run Code Online (Sandbox Code Playgroud)

但有时候,如果文件大小很大,那么只读取块的内存效率可能更高:buffer-size,因此你可以使用io.Reader.Readfrom 的实现*os.File

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


    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
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

否则,您也可以使用标准的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 file.Close()

    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

    }
}
Run Code Online (Sandbox Code Playgroud)

最后,我还想向您介绍这个令人敬畏的网站:go-lang文件cheatsheet.它包含了与在go-lang中处理文件相关的几乎所有内容,希望您会发现它很有用.

  • 尽管我有一个问题,但非常有用的答案:-我们是否需要在语句“fmt.Print(buf[:n])”中对“buf[:n]”进行切片。....对我来说,“fmt.Print(buf)”效果很好。………… (3认同)