Golang: ¿Cómo leer un archivo de texto?
(1)
Esta pregunta ya tiene una respuesta aquí:
Estoy tratando de leer "file.txt" y poner el contenido en una variable usando Golang. Esto es lo que he intentado ...
package main
import (
"fmt"
"os"
"log"
)
func main() {
file, err := os.Open("file.txt")
if err != nil {
log.Fatal(err)
}
fmt.Print(file)
}
El archivo se lee con éxito y el retorno de os.Open devuelve un tipo de * os.File
Depende de lo que estés tratando de hacer.
file, err := os.Open("file.txt")
fmt.print(file)
La razón por la que genera & {0xc082016240} es porque está imprimiendo el valor del puntero de un descriptor de archivo (
*os.File
), no el contenido del archivo.
Para obtener el contenido del archivo, puede
READ
desde un descriptor de archivo.
Para leer todo el contenido del archivo (en bytes) en la memoria,
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)
}
Pero a veces, si el tamaño del archivo es grande, podría ser más eficiente en la memoria simplemente leer en fragmentos: tamaño de búfer, por lo tanto, podría usar la implementación de
io.Reader.Read
desde
*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
}
}
}
De lo contrario, también podría usar el paquete de utilidades estándar:
bufio
, pruebe
Scanner
.
Un
Scanner
lee su archivo en tokens: separador.
De forma predeterminada, el escáner avanza el token por nueva línea (por supuesto, puede personalizar cómo el escáner debe tokenizar su archivo, aprenda desde aquí la prueba de 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
}
}
Por último, también me gustaría referirme a este increíble sitio: hoja de trucos de archivos go-lang . Abarcaba casi todo lo relacionado con el trabajo con archivos en go-lang, espero que les sea útil.