Golang:如何阅读文本文件?

时间:2016-03-20 08:47:37

标签: 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

的类型

2 个答案:

答案 0 :(得分:119)

需要io/ioutil个包。

如果您只想将内容设为string,那么简单的解决方案就是使用ReadFile包中的io/ioutil函数。此函数返回bytes的切片,您可以轻松将其转换为string

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

答案 1 :(得分:39)

这取决于你想要做什么。

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

它输出& {0xc082016240}的原因是因为您正在打印文件描述符(*os.File)的指针值,而不是文件内容。要获取文件内容,您可以从文件描述符中READ

要将所有文件内容(以字节为单位)读取到内存ioutil.ReadAll

package main

import (
    "fmt"
    "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)
}

但有时候,如果文件大小很大,那么只读取块大小可能会更节省内存:buffer-size,因此你可以使用来自io.Reader.Read的{​​{1}}的实现

*os.File

否则,您也可以使用标准的util包: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 } } } ,尝试bufioScanner在令牌中读取您的文件:分隔符。

默认情况下,扫描程序按换行符推进令牌(当然,您可以自定义扫描程序如何标记文件,请从此处了解the bufio test)。

Scanner

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