264 votes

Comment lire un fichier entier dans une variable de type chaîne de caractères ?

J'ai beaucoup de petits fichiers, je ne veux pas les lire ligne par ligne.

Existe-t-il une fonction dans Go qui permet de lire un fichier entier dans une variable de type chaîne ?

364voto

zzzz Points 23017

Utilisez ioutil.ReadFile :

func ReadFile(filename string) ([]byte, error)

ReadFile lit le fichier nommé par nom de fichier et renvoie son contenu. Un appel réussi renvoie err == nil, et non err == EOF. Parce que ReadFile lit le fichier entier, il ne traite pas ne traite pas un EOF provenant de Read comme une erreur à signaler.

Vous obtiendrez un []byte au lieu d'un string . Il peut être converti si vraiment nécessaire :

s := string(buf)

115voto

openwonk Points 7520

Si vous voulez juste le contenu comme string la solution la plus simple est d'utiliser l'option ReadFile de la fonction io/ioutil paquet. Cette fonction renvoie une tranche de bytes que vous pouvez facilement convertir en un 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'
}

25voto

Running Wild Points 1917

Je pense que la meilleure chose à faire, si vous êtes vraiment préoccupé par l'efficacité de la concaténation de tous ces fichiers, est de les copier tous dans le même tampon d'octets.

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())

Cela ouvre chaque fichier, copie son contenu dans buf, puis ferme le fichier. Selon votre situation, vous n'aurez peut-être pas besoin de le convertir, la dernière ligne sert juste à montrer que buf.Bytes() contient les données que vous recherchez.

16voto

Mo-Gang Points 58

C'est comme ça que j'ai fait :

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) 

}

9voto

Steven Penny Points 18523

Vous pouvez utiliser 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())
}

Ou si ça ne vous dérange pas []byte vous pouvez utiliser os.ReadFile :

package main
import "os"

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X