Подтвердить что ты не робот

Golang: Как читать текстовый файл?

Я пытаюсь прочитать "file.txt" и поместить содержимое в переменную с помощью Golang. Вот что я пробовал...

package main

import (
    "fmt"
    "os"
    "log"
)

func main() {
    file, err := os.Open("file.txt")
    if err != nil {
        log.Fatal(err)
    }

    fmt.Print(file)
}

Файл читается успешно, а возврат из os.Open возвращает тип * os.File

4b9b3361

Ответ 1

Вам только нужен пакет io/ioutil.

Если вам просто нужен контент как string, то простым решением является использование функции ReadFile из пакета io/ioutil. Эта функция возвращает фрагмент bytes, который вы можете легко преобразовать в 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'
}

Ответ 2

Это зависит от того, что вы пытаетесь сделать.

file, err := os.Open("file.txt")
fmt.print(file)

Причина, по которой он выводит & {0xc082016240}, заключается в том, что вы печатаете значение указателя дескриптора файла (*os.File), а не file-content. Чтобы получить файл-содержимое, вы можете READ из файла-дескриптора.


Чтобы прочитать все содержимое файла (в байтах) в память, 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)
}

Но иногда, если размер файла большой, может быть более эффективным использование памяти для простого чтения кусками: размер-буфера, поэтому вы можете использовать реализацию io.Reader.Read из *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
        }
    }

}

В противном случае вы также можете использовать стандартный пакет bufio: bufio, попробуйте Scanner. Scanner читает ваш файл в токенах: разделитель.

По умолчанию сканер продвигает токен по новой строке (конечно, вы можете настроить, как сканер должен токенизировать ваш файл, ознакомьтесь здесь с тестом 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

    }
}

Наконец, я также хотел бы сослаться на этот удивительный сайт: файл файл go-lang. Он охватывает почти все, что связано с работой с файлами в go-lang, надеюсь, вы найдете это полезным.