go

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.