J'essaie de lire "fichier.txt" et de mettre le contenu dans une variable utilisant Golang. Voici ce que j'ai essayé ...
package main
import (
"fmt"
"os"
"log"
)
func main() {
file, err := os.Open("file.txt")
if err != nil {
log.Fatal(err)
}
fmt.Print(file)
}
Le fichier est lu avec succès et le retour de os.Open renvoie un type * os.File
Vous seulement avez besoin du paquetage io/ioutil
.
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'
}
Cela dépend de ce que vous essayez de faire.
file, err := os.Open("file.txt")
fmt.print(file)
La raison pour laquelle elle génère & {0xc082016240} est que vous imprimez la valeur du pointeur d'un descripteur de fichier (*os.File
), et non du contenu de fichier. Pour obtenir le contenu d'un fichier, vous pouvez READ
à partir d'un descripteur de fichier.
Pour lire tout le contenu du fichier (en octets) en mémoire, ioutil.ReadAll
package main
import (
"fmt"
"io/ioutil"
"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)
}
Mais parfois, si la taille du fichier est importante, il peut s'avérer plus efficace d’économiser la mémoire si vous ne lisez que des fragments: taille du tampon, vous pouvez donc utiliser l’implémentation de io.Reader.Read
de *os.File
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
}
}
}
Sinon, vous pouvez également utiliser le paquet standard util: bufio
, essayez Scanner
. Un Scanner
lit votre fichier sous forme de jetons: séparateur.
Par défaut, le scanner fait avancer le jeton ligne par ligne (vous pouvez bien sûr personnaliser la manière dont le scanner doit marquer votre fichier. Pour en savoir plus, procédez comme suit: le test bufio ).
package main
import (
"fmt"
"os"
"log"
"bufio"
)
func main() {
file, err := os.Open("file.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() { // internally, it advances token based on sperator
fmt.Println(scanner.Text()) // token in unicode-char
fmt.Println(scanner.Bytes()) // token in bytes
}
}
Enfin, je voudrais également vous faire référence à ce site génial: Fichier de feuille de triche go-lang . Cela englobe à peu près tout ce qui concerne le travail avec les fichiers dans go-lang, j'espère que vous le trouverez utile.