Go語(yǔ)言讀取文本文件的三種方式總結(jié)
工作中時(shí)不時(shí)需要讀取文本,文本文件是最常見(jiàn)的文件類型。
本文將從逐行、逐個(gè)單詞和逐個(gè)字符三個(gè)方法讀取文件:
byLine.gobyWord.gobyCharacter.go
1 逐行讀取文本文件
逐行讀取文件是最為常見(jiàn)的文本文件,也是最為簡(jiǎn)單的方式。首先我們需要導(dǎo)入幾個(gè)常見(jiàn)的包:
- bufio:緩存區(qū)讀寫文件
- flag:命令行參數(shù)解析
package main
import (
"bufio"
"flag"
"fmt"
"io"
"os"
)
func lineByLine(file string) error {
var err error
f, err := os.Open(file)
if err != nil {
return err
}
defer f.Close()
r := bufio.NewReader(f)
for {
line, err := r.ReadString('\n')
if err == io.EOF {
break
} else if err != nil {
fmt.Printf("error reading file %s", err)
break
}
fmt.Print(line)
}
return nil
}
func main() {
flag.Parse()
if len(flag.Args()) == 0 {
fmt.Printf("usage: byLine <file1> [<file2> ...]\n")
return
}
for _, file := range flag.Args() {
err := lineByLine(file)
if err != nil {
fmt.Println(err)
}
}
}代碼解釋:
- 主要通過(guò)
bufio.NewReader()函數(shù)生成一個(gè)新的讀取器; - 隨后,在
bufio.ReadString()函數(shù)讀取字符,通知該函數(shù)持續(xù)執(zhí)行讀取任務(wù),直到碰到該 "\n" 參數(shù),也就是換行符。讀到換行符,執(zhí)行文本輸出。 - 如果讀取中斷了,即
err == io.EOF,退出文件讀取 - 或者
err != nil, 打印錯(cuò)誤提示,退出文件執(zhí)行
main() 函數(shù)中首先讀取命令行參數(shù),如果命令行長(zhǎng)度為 0,即沒(méi)有傳入要讀取的文件,如果此時(shí)執(zhí)行 byLine.go 文件的話就會(huì)給出語(yǔ)法提示,如下:
$ go run byLine.go
usage: byLine <file1> [<file2> ...]
我們寫一個(gè)測(cè)試的文本文件 test.txt, 寫入如下幾行數(shù)據(jù),記得在第二行換行(加入空行):
這是第一行
我是第二行
運(yùn)行如下命令后,結(jié)果為:
$ go run byLine.go test.txt
這是第一行
我是第二行
可以使用 cat test.txt 校驗(yàn)我們的結(jié)果的準(zhǔn)確性,如下:
$ cat test.txt
這是第一行
我是第二行
2 逐個(gè)單詞讀取文本文件
package main
import (
"bufio"
"flag"
"fmt"
"os"
)
func wordByWord(file string) error {
var err error
f, err := os.Open(file)
if err != nil {
return err
}
defer f.Close()
scanner := bufio.NewScanner(f)
scanner.Split(bufio.ScanWords)
var words []string
for scanner.Scan() {
words = append(words, scanner.Text())
}
for _, word := range words {
fmt.Println(word)
}
return nil
}
func main() {
flag.Parse()
if len(flag.Args()) == 0 {
fmt.Printf("usage: byWord <file1> [file2> ...]\n")
return
}
for _, file := range flag.Args() {
err := wordByWord(file)
if err != nil {
fmt.Println(err)
}
}
}代碼解釋:
- 其他代碼都和
byLine.go函數(shù)一樣,主要是利用了bufio中的 scanner 來(lái)掃描單詞, scanner := bufio.NewScanner(file)用來(lái)掃描讀取的文件scanner.Split(bufio.ScanWords)用來(lái)分割單詞- 聲明一個(gè)單詞字符串列表,將讀取到的每一個(gè)單詞放入這個(gè)列表中
- 循環(huán)遍歷單詞字符串列表,打印每一個(gè)單詞
測(cè)試代碼
寫入一個(gè) test.txt 文件:
Hello World
1 2 3
運(yùn)行代碼,結(jié)果顯示:
$ go run byWord.go test.txt
Hello
World
1
2
3
3 逐個(gè)字符讀取文本文件
逐個(gè)字符讀取文本的使用場(chǎng)景還是很少,除非開(kāi)發(fā)一個(gè)文本編輯器。新建一個(gè) byCharacter.go 文件,然后寫入如下代碼:
package main
import (
"bufio"
"flag"
"fmt"
"io"
"os"
)
func charByChar(file string) error {
var err error
f, err := os.Open(file)
if err != nil {
return err
}
defer f.Close()
r := bufio.NewReader(f)
for {
line, err := r.ReadString('\n')
if err == io.EOF {
break
} else if err != nil {
fmt.Printf("error reading file %s", err)
return err
}
for _, x := range line {
fmt.Println(string(x))
}
}
return nil
}
func main() {
flag.Parse()
if len(flag.Args()) == 0 {
fmt.Printf("usage: byWord <file1> [file2> ...]\n")
return
}
for _, file := range flag.Args() {
err := charByChar(file)
if err != nil {
fmt.Println(err)
}
}
}運(yùn)行測(cè)試用例得出的最后結(jié)果為:
$ go run byCharacter.go test.txt
H
e
l
l
o
W
o
r
l
d
總結(jié)
本文主要介紹 Go 中的 bufio 包,有些情況下,我們并不只是需要讀取整個(gè)一大段文件,所以需要把文件通過(guò)某種方式讀取,并介紹了 Go 讀取文本文件中的三種方法:
- 逐行讀取文本文件
byLine.go - 逐個(gè)單詞讀取文本文件
byWord.go - 逐個(gè)字符讀取文本文件
byCharacter.go
其實(shí)還有更多讀取文本文件的方法,比如通過(guò)逗號(hào)讀取、讀取特定數(shù)據(jù)量的文本,這些方法留到后文再作介紹
到此這篇關(guān)于Go語(yǔ)言讀取文本文件的三種方式總結(jié)的文章就介紹到這了,更多相關(guān)Go語(yǔ)言讀取文本文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語(yǔ)言實(shí)現(xiàn)IP段范圍校驗(yàn)示例
這篇文章主要介紹了Go語(yǔ)言實(shí)現(xiàn)IP段范圍校驗(yàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Go基礎(chǔ)教程系列之WaitGroup用法實(shí)例詳解
這篇文章主要介紹了Go基礎(chǔ)教程系列之WaitGroup用法實(shí)例詳解,需要的朋友可以參考下2022-04-04
使用go語(yǔ)言實(shí)現(xiàn)查找兩個(gè)數(shù)組的異同操作
這篇文章主要介紹了使用go語(yǔ)言實(shí)現(xiàn)查找兩個(gè)數(shù)組的異同操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
Go中阻塞以及非阻塞操作實(shí)現(xiàn)(Goroutine和main Goroutine)
本文主要介紹了Go中阻塞以及非阻塞操作實(shí)現(xiàn)(Goroutine和main Goroutine),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05
golang中g(shù)in框架接入jwt使用token驗(yàn)證身份
本文主要介紹了golang中g(shù)in框架接入jwt使用token驗(yàn)證身份,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12

