go 逐行读取文件

前言

文件 I/O特别是对文件的读写是编程语言中重要的功能。通常我们需要逐行读取文件

GO 提供了 ​​bufio​​​ 软件包,实现了有缓冲的 I/O。它包装一个 ​​io.Reader​​​ 或 ​​io.Writer​接口对象,创建其他应付款另一个也实现了该接口其他综合收益,且同时还提供了缓冲和一些文本其他和其它的区别 I/O 的帮助函数的对象。

读取文件之前,我们首先需要使用 ​​os.Open()​​​ 函数将其打开,该函数返回指向文件的指针类型。代码段中显示的 ​​D:\\go_work\\test.txtgoogle​ 文件需要已经存在在系统中(将路径放置到文件所在的读取文件失败什么原因位置)。

​bufio.NewScanner(file)​​​ 函数创建并返回一个从 ​​r​​​ 读取数据的 ​​Scanner​​​ 类型,该类型中的函数支持读取文件,其中默认的分割函数是 ​​ScanLines​​。

要逐行读取文件,我们需要使用两种在新的 ​​Scanner​​​ 的方系统运维工程师法 ​​Scan​​​,它会获取当前位工商银行置的 token(该 token 可以通过 Bytes 或 Text 方法获得,在本例中为新行),并让 ​​Scanner​​​ 的扫描位置移动到下一个 ​​to读取文件ken​​​,和 Text(或 Byte)读取调用 ​​Scan​​ 时生成的最新符记。

如果在读取文件时遇到任何错误,可以通过在新的 ​​Scanner​​​读取数据最快的设备 上调用 ​​Err()​​​ 方法来处理这些错误,该方法将返回 ​​Scanne读取数据r​​​ 遇到其他的第一个非系统运维包括哪些内容文件结尾错误;除非是 ​​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​​​ 是 ​​S工商银行canLines​​,它将返回文本的每一行,并删除行尾标记其他应付款。

例如,我们可以使用单词进行拆分,如下面的代码片段所示:

scanner.Split(bufio.ScanWords)  //configure how the scanner behaves