我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Golang按行读取文件的三种方法小结

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Golang按行读取文件的三种方法小结

Golang 是一种现代的编程语言,它具有高效、简洁和可扩展等特点,因此在各种领域广泛应用。在 Golang 中,读取文件是一个常见的操作。在本篇技术博客中,我将介绍如何在 Golang 中按行读取文件。

1.使用 bufio.Scanner 读取文件

Golang 中有一个 bufio 包,它提供了 Scanner 类型,可以方便地按行读取文件。我们可以使用 Scanner 的 Scan() 方法来读取每一行。

bufio.Scanner是一个基于缓冲区的数据扫描器,它提供了方便的逐行/逐词读取操作。Scan 方法是bufio.Scanner 的一个核心方法,用于扫描缓冲区中的数据并返回扫描到的下一个 Token。

Scan 方法的签名如下:

func (s *Scanner) Scan() bool

该方法返回一个 bool 类型值,表示扫描是否成功。如果扫描成功,该方法会将下一个Token读取出来并保存在Scanner的Text字段中。如果扫描失败,则返回false。

在读取Token之前,Scanner会将缓冲区中的数据读取到底层的Reader中,并从底层的Reader中获取新的数据填充到缓冲区中。因此,在Scan方法调用之前,Scanner的缓冲区中可能已经包含了一部分数据,也可能为空。

扫描过程中,Scanner会将缓冲区中的数据按照分隔符进行分割,并将分割后的Token返回。默认情况下,Scanner使用换行符作为分隔符,即每次扫描一行数据。如果需要使用其他分隔符,可以使用Scanner的Split方法进行设置。

// ReadLines reads all lines of the file.
func ReadLines(path string) ([]string, error) {
    file, err := os.Open(path)
    if err != nil {
        return nil, err
    }
    defer file.Close()

    var lines []string
    scanner := bufio.NewScanner(file)
    for scanner.Scan() {
        lines = append(lines, scanner.Text())
    }
    return lines, scanner.Err()
}

上面的代码中,我们首先使用 NewScanner() 函数创建一个 Scanner 对象。然后在 for 循环中,我们使用 Scanner 的 Scan() 方法读取文件的每一行,然后使用 Text() 方法获取每一行的内容。最后,我们将获取到的行追加到字符串切片中。

2.使用 bufio.Reader 读取文件

除了使用 Scanner 类型之外,我们还可以使用 bufio 包中的 Reader 类型按行读取文件。在使用 bufio.Reader 时,我们需要使用 ReadBytes() 或 ReadString() 方法来读取每一行,示例代码如下:

// ReadLinesV2 reads all lines of the file.
func ReadLinesV2(path string) ([]string, error) {
    file, err := os.Open(path)
    if err != nil {
        return nil, err
    }
    defer file.Close()

    var lines []string
    reader := bufio.NewReader(file)
    for {
        // ReadString reads until the first occurrence of delim in the input,
        // returning a string containing the data up to and including the delimiter.
        line, err := reader.ReadString('\n')
        if err == io.EOF {
            lines = append(lines, line)
            break
        }
        if err != nil {
            return lines, err
        }
        lines = append(lines, line[:len(line)-1])
    }
    return lines, nil
}

上面的代码中,我们使用 NewReader() 函数创建一个 Reader 对象。在 for 循环中,我们使用 ReadString() 函数读取每一行的内容,并将其追加到字符串切片中。

需要注意的是,在使用 ReadString() 函数时,我们需要指定分隔符,例如 ‘\n’ 表示以换行符为分隔符。如果读取的文件中没有指定的分隔符,ReadString() 函数会返回一个错误,因此我们需要在 for 循环中检查是否发生了错误。

3.使用 bufio.Reader 的 ReadLine 读取文件

使用 bufio.Reader 逐行读取文件时,除了使用 ReadBytes() 或 ReadString() 方法,还可以使用 ReadLine() 函数。

// ReadLinesV3 reads all lines of the file.
func ReadLinesV3(path string) ([]string, error) {
    f, err := os.Open(path)
    if err != nil {
        return nil, err
    }
    defer f.Close()

    var lines []string
    r := bufio.NewReader(f)
    for {
        // ReadLine is a low-level line-reading primitive.
        // Most callers should use ReadBytes('\n') or ReadString('\n') instead or use a Scanner.
        bytes, _, err := r.ReadLine()
        if err == io.EOF {
            break
        }
        if err != nil {
            return lines, err
        }
        lines = append(lines, string(bytes))
    }
    return lines, nil
}

使用 bufio.Reader 的 ReadLine() 方法可以读取一行数据,但是需要注意它的返回值。ReadLine() 函数的返回值包括三个部分:读取到的数据、是否读取完整一行以及错误信息。如果读取到的数据超出了缓存区的大小,它会返回一个错误信息,而不是完整的一行数据。

因此,如果读取的一行数据的长度超过了缓存区的大小,ReadLine() 函数将无法读取到完整的一行数据。为了避免这种情况的发生,我们可以通过设置缓存区的大小来解决。

ReadLine 是一个低级的行读取原语。大多数调用者应该使用 ReadBytes(‘\n’) 或 ReadString(‘\n’),或者使用 Scanner。

4.go-huge-util

本文实现的函数已放置开源仓库 dablelv/go-huge-util,欢迎大家使用。

package main

import (
    "github.com/dablelv/go-huge-util/file"
)

func main() {
    path := "your/file/path"
    lines, err := file.ReadLines(path)
    lines, err = file.ReadLinesV2(path)
    lines, err = file.ReadLinesV3(path)
}

推荐使用 file.ReadLines。

go-huge-util 除了类型转换,还有很多其他实用函数,如加解密、zip 解压缩等,欢迎大家使用、Star、Issue 和 Pull Request。

参考文献

dablelv/go-huge-util - GitHub

到此这篇关于Golang 按行读取文件的三种方法小结的文章就介绍到这了,更多相关Golang 按行读取文件内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Golang按行读取文件的三种方法小结

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Golang按行读取文件的三种方法小结

本文主要介绍了Golang按行读取文件的三种方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-17

Golang实现按行读取文件的方法小结

Go语言按行读取文件方法总结:bufio.Scanner:逐行读取,支持分隔符和缓冲区控制;io.ReadLines(Go1.18+):一次性读取文件,按行分割;os.ReadFile+strings.Split:读取整个文件后按行分割;文件流+io.ReadLine:利用文件流按行读取;性能比较:io.ReadLines和bufio.Scanner适用于小文件,io.ReadLines适用于大文件,os.ReadFile通常较慢。选择方法根据文件大小和性能要求:小文件推荐io.ReadLines,大文件
Golang实现按行读取文件的方法小结
2024-04-02

ASP.Net Core读取配置文件的三种方法小结

ASP.NetCore中读取配置文件有三种方法:1.使用IConfiguration:通过依赖注入获取IConfiguration对象,然后使用GetSection和GetValue方法获取配置值。2.使用OptionsPattern:创建POCO对象表示配置,使用OptionsBuilder绑定,通过DI注入获取配置对象。3.使用IConfigurationRoot:通过DI注入获取IConfigurationRoot对象,使用GetChildSection和GetValue方法获取配置值。
ASP.Net Core读取配置文件的三种方法小结
2024-04-02

shell按行读取文件的3种方法

方法有很多,下面写出三种方法:写法一: #!/bin/bashwhile read linedoecho $linedone < filename(待读取的文件) 写法二: #!/bin/bashcat filename(待读取的文件) |
2022-06-04

Python按行读取文件的实现方法【小文件和大文件读取】

本文实例讲述了Python按行读取文件的实现方法。分享给大家供大家参考,具体如下: 小文件:#coding=utf-8 #author: walker #date: 2013-12-30 #function: 按行读取小文件 all_lin
2022-06-04

python3读取文件指定行的三种方法

目录行遍历实现linecache实现命令行sed获取总结概要行遍历实现在python中如果要将一个文件完全加载到内存中,通过file.readlines()即可,但是在文件占用较高时,我们是无法完整的将文件加载到内存中的,这时候就需要用到p
2022-06-02

Python之读取TXT文件的三种方法

参考了https://blog.csdn.net/shandong_chu/article/details/70173952 import sys方法一:#read txt method one f = open("./image/ab
2023-01-31

Go语言读取文本文件的三种方式总结

工作中时不时需要读取文本,文本文件是最常见的文件类型。本文将利用Go语言从逐行、逐个单词和逐个字符三个方法读取文件,感兴趣的可以了解一下
2023-01-12

shell按行读取文件的方法有哪些

这篇文章主要介绍“shell按行读取文件的方法有哪些”,在日常操作中,相信很多人在shell按行读取文件的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”shell按行读取文件的方法有哪些”的疑惑有所
2023-06-09

MySQL导入sql文件的三种方法小结

目录一、使用工具Navicat for mysql导入1.打开localhost_3306,选中右击“新建数据库”2.指定数据库名和字符集(可根据sql文件的字符集类型自行选择)3.选中数据库下的表运行SQL文件4.
2023-02-03

Shell逐行读取文件的4种方法

在Linux中有很多方法逐行读取一个文件的方法,其中最常用的就是下面的脚本里的方法,而且是效率最高,使用最多的方法。为了给大家一个直观的感受,我们将通过生成一个大的文件的方式来检验各种方法的执行效率。方法1:while循环中执行效率最高,最
2022-06-04

Python按行读取文件的简单实现方法

1:readline()file = open("sample.txt") while 1:line = file.readline()if not line:breakpass # do something file.close()一行
2022-06-04

Java读取Properties文件的七种方法的总结

Java读取Properties文件的方法总结 读取.properties配置文件在实际的开发中使用的很多,总结了一下,有以下几种方法:其实很多都是大同小异,概括起来就2种:先构造出一个InputStream来,然后调用Pr
2023-05-31

android按行读取文件内容的几个方法

一、简单版代码如下: import java.io.FileInputStream; void readFileOnLine(){ String strFileName = "Filename.txt"; FileInputStream
2022-06-06

C++读取文件的四种方式总结

C++可以根据不同的目的来选取文件的读取方式,C++中有四种常见的读取方式,本文主要介绍了这四种方法的具体实现,需要的可以参考一下
2023-05-15

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录