網(wǎng)站首頁 編程語言 正文
工作中時(shí)不時(shí)需要讀取文本,文本文件是最常見的文件類型。
本文將從逐行、逐個(gè)單詞和逐個(gè)字符三個(gè)方法讀取文件:
byLine.go
byWord.go
byCharacter.go
1 逐行讀取文本文件
逐行讀取文件是最為常見的文本文件,也是最為簡(jiǎn)單的方式。首先我們需要導(dǎo)入幾個(gè)常見的包:
- 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) } } }
代碼解釋:
- 主要通過?
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,即沒有傳入要讀取的文件,如果此時(shí)執(zhí)行?byLine.go
?文件的話就會(huì)給出語法提示,如下:
$ 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 來掃描單詞, -
scanner := bufio.NewScanner(file)
?用來掃描讀取的文件 -
scanner.Split(bufio.ScanWords)
?用來分割單詞 - 聲明一個(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)景還是很少,除非開發(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è)一大段文件,所以需要把文件通過某種方式讀取,并介紹了 Go 讀取文本文件中的三種方法:
- 逐行讀取文本文件?
byLine.go
- 逐個(gè)單詞讀取文本文件?
byWord.go
- 逐個(gè)字符讀取文本文件?
byCharacter.go
其實(shí)還有更多讀取文本文件的方法,比如通過逗號(hào)讀取、讀取特定數(shù)據(jù)量的文本,這些方法留到后文再作介紹
原文鏈接:https://segmentfault.com/a/1190000043291434
相關(guān)推薦
- 2022-11-15 Python函數(shù)式編程之返回函數(shù)實(shí)例詳解_python
- 2022-05-22 Kubernetes探針使用介紹_云其它
- 2022-05-05 Python數(shù)據(jù)序列化之pickle模塊_python
- 2022-11-07 python單元測(cè)試框架unittest基本用法案例_python
- 2022-08-18 python數(shù)據(jù)可視化pygal模擬擲骰子實(shí)現(xiàn)示例_python
- 2021-12-05 React實(shí)現(xiàn)一個(gè)通用骨架屏組件示例_React
- 2023-03-22 React?Native全面屏狀態(tài)欄和底部導(dǎo)航欄適配教程詳細(xì)講解_React
- 2022-04-06 用Python實(shí)現(xiàn)一個(gè)簡(jiǎn)單的用戶系統(tǒng)_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支