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 ?
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 ?
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)
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'
}
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.
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 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.