• go 逐行读取文件


    前言

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

    GO 提供了 bufio 软件包,实现了有缓冲的 I/O。它包装一个 io.Readerio.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 如何拆分给定的字节片。默认的 SplitFuncScanLines,它将返回文本的每一行,并删除行尾标记。

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

    scanner.Split(bufio.ScanWords)  //configure how the scanner behaves
    
  • 相关阅读:
    Python之os模块
    Python之加密模块
    Python之random模块
    Python之操作MySQL数据库
    Python之操作Excel
    Jmeter之发送请求入参必须使用编码格式、Jmeter之发送Delete请求可能入参需要使用编码格式
    PAT B1008 数组元素循环右移问题 (20 分)
    PAT B1007 素数对猜想 (20 分)
    PAT B1006 换个格式输出整数 (15 分)
    PAT B1005 继续(3n+1)猜想 (25 分)
  • 原文地址:https://www.cnblogs.com/niuben/p/15692069.html
Copyright © 2020-2023  润新知