go 逐行读取文件
前言
文件 I/O,特别是对文件的读写是编程语言中重要的功能。通常,我们需要逐行读取文件。
GO 提供了 bufio
软件包,实现了有缓冲的 I/O。它包装一个 io.Reader
或 io.Writer
接口对象,创建另一个也实现了该接口,且同时还提供了缓冲和一些文本 I/O 的帮助函数的对象。
在读取文件之前,我们首先需要使用 os.Open()
函数将其打开,该函数返回指向文件的指针类型。代码段中显示的 D:\\go_work\\test.txt
文件需要已经存在在系统中(将路径放置到文件所在的位置)。
bufio.NewScanner(file)
函数创建并返回一个从 r
读取数据的 Scanner
类型,该类型中的函数支持读取文件,其中默认的分割函数是 ScanLines
。
要逐行读取文件,我们需要使用两种在新的 Scanner
的方法 Scan
,它会获取当前位置的 token(该 token 可以通过 Bytes 或 Text 方法获得,在本例中为新行),并让 Scanner
的扫描位置移动到下一个 token
,和 Text(或 Byte)读取调用 Scan
时生成的最新符记。
如果在读取文件时遇到任何错误,可以通过在新的 Scanner
上调用 Err()
方法来处理这些错误,该方法将返回 Scanner
遇到的第一个非文件结尾错误;除非是 io.EOF
,此时 Err
会返回 nil
。
Go 逐行读取文件的完整代码
package main
import (
"bufio"
"fmt"
"log"
"os"
)
func main() {
// open the file
file, err := os.Open("D:\\go_work\\test.txt")
// handle errors while opening
if err != nil {
log.Fatalf("Error when opening file: %s", err)
}
defer file.Close()
fileScanner := bufio.NewScanner(file)
// read line by line
for fileScanner.Scan() {
fmt.Println(fileScanner.Text())
}
// handle first encountered error while reading
if err := fileScanner.Err(); err != nil {
log.Fatalf("Error while reading file: %s", err)
}
}
配置 Scanner 行为
Scanner
类型具有 Split
函数,该函数接受 SplitFunc
函数来确定 Scanner
如何拆分给定的字节片。默认的 SplitFunc
是 ScanLines
,它将返回文本的每一行,并删除行尾标记。
例如,我们可以使用单词进行拆分,如下面的代码片段所示:
scanner.Split(bufio.ScanWords) //configure how the scanner behaves
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Brainfly: 用 C# 类型系统构建 Brainfuck 编译器
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· DeepSeek 全面指南,95% 的人都不知道的9个技巧(建议收藏)
· 对比使用DeepSeek与文新一言,了解DeepSeek的关键技术论文
· Brainfly: 用 C# 类型系统构建 Brainfuck 编译器
· DeepSeekV3+Roo Code,智能编码好助手
· AI编程:如何编写提示词
2020-12-15 初级程序员常犯错误一览