web-dev-qa-db-fra.com

Golang: Comment lire un fichier texte?

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

71
Acidic

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'
}
118
openwonk

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.

45
Roy Lee