web-dev-qa-db-fra.com

Comment puis-je lire un fichier entier dans une variable chaîne

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

Existe-t-il une fonction dans Go qui lit tout un fichier dans une variable chaîne?

115
MrROY

Utilisez ioutil.ReadFile :

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

ReadFile lit le fichier nommé par nom de fichier et renvoie le contenu. Un appel réussi renvoie err == nil, pas err == EOF. Étant donné que ReadFile lit l'intégralité du fichier, il ne traite pas un EOF 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)
185
zzzz

Si vous souhaitez simplement que le contenu soit au format string, la solution simple consiste à utiliser la fonction ReadFile du package io/ioutil. Cette fonction renvoie une tranche de bytes que vous pouvez facilement convertir en 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'
}
30
openwonk

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 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 la convertir. La dernière ligne est simplement destinée à indiquer que buf.Bytes () contient les données que vous recherchez.

13
Running Wild

Voici comment je l'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) 

}    
2
Mo-Gang

Je ne suis pas avec l'ordinateur, alors j'écris un brouillon. Vous pourriez être clair de ce que je dis.

func main(){
    const dir = "/etc/"
    filesInfo, e := ioutil.ReadDir(dir)
    var fileNames = make([]string, 0, 10)
    for i,v:=range filesInfo{
        if !v.IsDir() {
            fileNames = append(fileNames, v.Name())
        }
    }

    var fileNumber = len(fileNames)
    var contents = make([]string, fileNumber, 10)
    wg := sync.WaitGroup{}
    wg.Add(fileNumber)

    for i,_:=range content {
        go func(i int){
            defer wg.Done()
            buf,e := ioutil.Readfile(fmt.Printf("%s/%s", dir, fileName[i]))
            defer file.Close()  
            content[i] = string(buf)
        }(i)   
    }
    wg.Wait()
}
0
fwhez