如何将整个文件读入字符串变量

MrR*_*ROY 153 string file go

我有很多小文件,我不想逐行阅读.

Go中是否有一个函数将整个文件读入字符串变量?

zzz*_*zzz 237

用途ioutil.ReadFile:

func ReadFile(filename string) ([]byte, error)
Run Code Online (Sandbox Code Playgroud)

ReadFile读取由filename命名的文件并返回内容.成功的调用返回err == nil,而不是err == EOF.因为ReadFile读取整个文件,所以它不会将Read中的EOF视为要报告的错误.

你会得到一个[]byte而不是一个string.如果真的有必要可以转换它:

s := string(buf)
Run Code Online (Sandbox Code Playgroud)

  • 现在我们操作系统已弃用 Ioutil 进行文件处理。 (6认同)
  • 然后,为了构造最终的字符串结果,您可以使用append()在读取每个文件时在单个字节切片中累积数据,然后将累积的字节切片转换为最终的字符串结果.或者你可能喜欢bytes.Join. (5认同)
  • 然后向我们展示如何转换它......这个问题不要求字节数组。 (4认同)

ope*_*onk 44

如果你只想要内容string,那么简单的解决方案是使用包中的ReadFile函数io/ioutil.此函数返回一个切片bytes,您可以轻松地将其转换为a 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'
}
Run Code Online (Sandbox Code Playgroud)


Run*_*ild 18

我认为最好的办法是,如果你真的关心连接所有这些文件的效率,那就是将它们全部复制到相同的字节缓冲区中.

buf := bytes.NewBuffer(nil)
for _, filename := range filenames {
  f, _ := os.Open(filename) // Error handling elided for brevity.
  io.Copy(buf, f)           // Error handling elided for brevity.
  f.Close()
}
s := string(buf.Bytes())
Run Code Online (Sandbox Code Playgroud)

这将打开每个文件,将其内容复制到buf,然后关闭该文件.根据您的情况,您可能实际上不需要转换它,最后一行只是为了表明buf.Bytes()具有您正在寻找的数据.


Mo-*_*ang 12

我是这样做的:

package main

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

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

   buf := new(bytes.Buffer)
   buf.ReadFrom(filerc)
   contents := buf.String()

   fmt.Print(contents) 

}    
Run Code Online (Sandbox Code Playgroud)


小智 9

您可以使用strings.Builder

package main

import (
   "io"
   "os"
   "strings"
)

func main() {
   f, err := os.Open("file.txt")
   if err != nil {
      panic(err)
   }
   defer f.Close()
   b := new(strings.Builder)
   io.Copy(b, f)
   print(b.String())
}
Run Code Online (Sandbox Code Playgroud)

或者如果你不介意[]byte,你可以使用 os.ReadFile

package main
import "os"

func main() {
   b, err := os.ReadFile("file.txt")
   if err != nil {
      panic(err)
   }
   os.Stdout.Write(b)
}
Run Code Online (Sandbox Code Playgroud)