为了账号安全,请及时绑定邮箱和手机立即绑定

如何读取文本文件?

如何读取文本文件?

Go
不负相思意 2021-12-27 15:03:04
我正在尝试读取“file.txt”并使用 Golang 将内容放入变量中。这是我尝试过的...package mainimport (    "fmt"    "os"    "log")func main() {    file, err := os.Open("file.txt")    if err != nil {        log.Fatal(err)    }    fmt.Print(file)}文件被成功读取并且从os.Open返回的返回类型为*os.File
查看完整描述

1 回答

?
青春有我

TA贡献1784条经验 获得超8个赞

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


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


    }

}

最后,我还想向您推荐这个很棒的网站:go-lang filecheatsheet。它几乎涵盖了与在 go-lang 中处理文件相关的所有内容,希望您会发现它很有用。


查看完整回答
反对 回复 2021-12-27
  • 1 回答
  • 0 关注
  • 169 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信