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
Ответы
Ответ 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, надеюсь, вы найдете это полезным.