go读取文件的几种方法

Go语言基础入门(处理文件) Go标准库中提供了ioutil包,让我们能够快速执行读写文件的操作。 读取文件。Readfile函数,将一个文件名作为参数,并以字节切片的方式返回文件的内容。这意味着如果要将文件内容作为字符串使用,则必须将返回的字节切片转换为字符串。 fileBytes, err := ioutil.ReadFile("xxx.txt") fileString := string(fileBytes) 创建文件。WriteFile函数,接受一个文件名,要写入文件的数据以及应用于文件的权限。Go语言使用UNI 阅读详情

一. 整个文件读入内存

直接将数据直接读取入内存,是效率最高的一种方式,但此种方式,仅适用于小文件,对于大文件,则不适合,因为比较浪费内存

1.直接指定文化名读取

在 Go 1.16 开始,ioutil.ReadFile 就等价于 os.ReadFile,二者是完全一致的

1.1使用os.ReadFile函数读取文件
package main
 
import (
    "fmt"
    "os"
)
 
func main() {
    content, err := os.ReadFile("a.txt")
    if err != nil {
        panic(err)
    }

    fmt.Println(string(content))
}

1.2使用ioutil.ReadFile函数读取文件

package main
 
import (
    "io/ioutil"
    "fmt"
)
 
func main() {
    content, err := ioutil.ReadFile("a.txt")
    if err != nil {
        panic(err)
    }
    fmt.Println(string(content))
}

2.先创建句柄再读取

2.1使用os.OpenFile函数只读形式获取句柄
package main
 
import (
"os"
"io/ioutil"
"fmt"
)
 
func main() {
    file, err := os.Open("a.txt")
    if err != nil {
        panic(err)
    }

    defer file.Close()
    content, err := ioutil.ReadAll(file)
    fmt.Println(string(content))
}

二.每次只读取一行

一次性读取所有的数据,太耗费内存,因此可以指定每次只读取一行数据,方法有三种:

(1)bufio.读行()

(2)bufio.读取字节("\n")

(3)bufio.ReadString(’\n’)

在 bufio 的源码注释中,曾说道 bufio.ReadLine() 是低级库,不太适合普通用户使用,更推荐用户使用 bufio.ReadBytes和bufio.ReadString 去读取单行数据

因此,这里不再介绍 bufio.读行()

1.使用bufio.Reader结构体的ReadBytes方法读取字节数

ReadBytes读取直到第一次遇到delim字节,返回一个包含已读取的数据和delim字节的切片。如果ReadBytes方法在读取到delim之前遇到了错误,它会返回在错误之前读取的数据以及该错误(一般是io.EOF)。当且仅当ReadBytes方法返回的切片不以delim结尾时,会返回一个非nil的错误

package main
 
import (
    "bufio"
    "fmt"
    "io"
    "os"
    "strings"
)
 
func main() {
    // 创建句柄
    fi, err := os.Open("christmas_apple.py")
    if err != nil {
        panic(err)
    }
    //func NewReader(rd io.Reader) *Reader {},返回的是bufio.Reader结构体
    r := bufio.NewReader(fi)// 创建 Reader
 
    for {
        lineBytes, err := r.ReadBytes('\n')
        //去掉字符串首尾空白字符,返回字符串
        line := strings.TrimSpace(string(lineBytes))
        if err != nil && err != io.EOF {
            panic(err)
        }
        if err == io.EOF {
            break
        }
        fmt.Println(line)
    }
}

2.使用bufio.Reader结构体的ReadString方法读取字符串

ReadString读取直到第一次遇到delim字节,返回一个包含已读取的数据和delim字节的字符串。如果ReadString方法在读取到delim之前遇到了错误,它会返回在错误之前读取的数据以及该错误(一般是io.EOF)。当且仅当ReadString方法返回的切片不以delim结尾时,会返回一个非nil的错误

package main
 
import (
    "bufio"
    "fmt"
    "io"
    "os"
    "strings"
)
 
func main() {
    // 创建句柄
    fi, err := os.Open("a.txt")
    if err != nil {
        panic(err)
    }
 
    // 创建 Reader
    r := bufio.NewReader(fi)
 
    for {
        line, err := r.ReadString('\n')
        line = strings.TrimSpace(line)
        if err != nil && err != io.EOF {
            panic(err)
        }
        if err == io.EOF {
            break
        }
        fmt.Println(line)
    }
}

三.每次只读取固定字节数

每次仅读取一行数据,可以解决内存占用过大的问题,但要注意的是,并不是所有的文件都有换行符 \n;
因此对于一些不换行的大文件来说,还得再想想其他办法

1.使用os库

通用的做法是:

先创建一个文件句柄,可以使用 os.Open 或者 os.OpenFile;

然后 bufio.NewReader 创建一个 Reader;

然后在 for 循环里调用 Reader 的 Read 函数,每次仅读取固定字节数量的数据

Read方法读取数据写入p;本方法返回写入p的字节数;本方法一次调用最多会调用下层Reader接口一次Read方法,因此返回值n可能小于len§;读取到达结尾时,返回值n将为0而err将为io.EOF

package main
 
import (
    "bufio"
    "fmt"
    "io"
    "os"
)
 
func main() {
    // 创建句柄
    fi, err := os.Open("a.txt")
    if err != nil {
        panic(err)
    }
 
    // 创建 Reader
    r := bufio.NewReader(fi)
 
    // 每次读取 1024 个字节
    buf := make([]byte, 1024)
    for {
        //func (b *Reader) Read(p []byte) (n int, err error) {}
        n, err := r.Read(buf)
        if err != nil && err != io.EOF {
            panic(err)
        }
 
        if n == 0 {
            break
        }
        fmt.Println(string(buf[:n]))
    }
}

2.使用 syscall库

os 库本质上也是调用 syscall 库,但由于 syscall 过于底层,如非特殊需要,一般不会使用 syscall;

本篇为了内容的完整度,这里也使用 syscall 来举个例子;

本例中,会每次读取 100 字节的数据,并发送到通道中,由另外一个协程进行读取并打印出来

package main
 
import (
    "fmt"
    "sync"
    "syscall"
)
 
func main() {
    fd, err := syscall.Open("christmas_apple.py", syscall.O_RDONLY, 0)
    if err != nil {
        fmt.Println("Failed on open: ", err)
    }
    defer syscall.Close(fd)
 
    var wg sync.WaitGroup
    wg.Add(2)
    dataChan := make(chan []byte)
    go func() {
        wg.Done()
        for {
            data := make([]byte, 100)
            n, _ := syscall.Read(fd, data)
            if n == 0 {
                break
            }
            dataChan <- data
        }
        close(dataChan)
    }()
 
    go func() {
        defer wg.Done()
        for {
            select {
            case data, ok := <-dataChan:
                if !ok {
                    return
                }
 
                fmt.Printf(string(data))
            default:
 
            }
        }
    }()
    wg.Wait()
}
深入了解Golang中多线程读取大文件 在golang中,多线程读取一个大文件是一个常见的需求。本文将详细解释如何实现这个功能,并介绍学习目标和学习内容。 阅读详情

相关推荐

使用Golang读取文件内容

以上就是使用Golang读取文件内容的详细步骤和相应的源代码示例。通过以上方法,你可以在Golang中轻松地读取文件的内容,并进行进一步的处理。下面我将为你详细介绍如何使用Golang读取文件内容的步骤,并提供相应的源代码示例。在读取文件内容时,可能会出现一些错误,例如文件不存在或者权限不足。函数时,它会返回一个布尔值,表示是否成功读取到一行内容。在示例中,我们简单地将每一行的内容打印出来。包提供的函数来读取文件的内容。类型的对象,并将打开的文件作为参数传递给它。在读取文件内容之前,我们需要先打开文件。

HoUnix的博客 314

超全总结:Go 读文件的 10 种方法

大家好,我是明哥。Go 中对文件内容读写的方法,非常地多,其中大多数是基于 syscall 或者 os 库的高级封装,不同的库,适用的场景又不太一样,为免新手在这块上裁跟头,我花了点时间...

slphahaha的博客 1万+

别再拿空气标定法糊弄了!手把手教你搞定水下相机标定(附Python代码)

本文详细解析水下相机标定的关键技术,揭示传统空气标定法失效原因,并提供基于单视点模型(SVP)的完整Python解决方案。通过折射效应分析、标定板设计优化和代码实战演示,帮助读者掌握水下标定核心方法,有效提升水下视觉系统测量精度。

weixin_30530939的博客 207

【Go|第4期】Go读取文件的几种方式

在Go语言中,读取文件是很重要的操作,有很多种方式可以实现,这里介绍一些比较常用的方式,大家可以根据实际情况选择合适的方式去读取文件。

Commas的博客 1378

GitHub与GitLab中的Fork操作:从个人仓库到团队协作的完整指南

本文详细介绍了GitHub与GitLab中的Fork操作,从个人仓库到团队协作的完整指南。通过Fork操作,开发者可以在权限隔离的环境下自由实验,并通过合并请求机制保证代码质量。文章涵盖了Fork的具体步骤、本地开发环境配置、代码同步方法以及高级协作技巧,帮助团队高效管理代码仓库。

weixin_28829325的博客 306

Java 简易版 UDP 多人聊天室

【代码】Java 简易版 UDP 多人聊天室。

nmy15570188135的博客 1187

Go 读取文件的几种方法

ioutil.ReadFile const filename = "abc.txt" if contents, err := ioutil.ReadFile(filename); err != nil { fmt.Println(err) } else { fmt.Printf("%s\n", contents) } bufio.NewScanner file, err := os.Open(filename) if err != nil{ panic(err) } scanner := bufi

zhcourse的博客 1171

Vue2项目实战:海康威视WEB无插件开发包V3.4从下载到多画面预览(附完整代码)

本文详细介绍了在Vue2项目中集成海康威视WEB无插件开发包V3.4实现多画面监控预览的完整实战方案。内容涵盖从开发包下载、Nginx代理配置、核心组件封装到多画面并发加载与性能优化的全流程,并提供了完整的代码示例,帮助开发者高效解决浏览器无插件播放与多路视频流加载的难题。

c7d8e9的博客 320

golang读取文件内容的方法

golang读取文件的方法

qq_31389153的博客 996

IP2315高效同步降压充电IC在快充应用中的硬件与软件控制策略

本文深入解析IP2315高效同步降压充电IC在快充应用中的硬件与软件控制策略,涵盖其核心特性、硬件电阻调节技巧、I2C动态控制方案、散热设计优化及典型问题排查。IP2315支持多种快充协议,如Type-C PD、华为FCP等,适用于便携设备快速充电需求,并通过I2C实现灵活的充电参数设置,提升充电效率与安全性。

weixin_29248313的博客 538

通义千问语言模型Qwen2.5架构详解

此外,将基于API的模型 Qwen-Plus 与领先的专有和开源模型进行了对比,包括 GPT4-o、Claude-3.5-Sonnet、Llama-3.1-405B和DeepSeek-V2.5。Qwen2.5-Math-72B-Instruct的整体性能超越了Qwen2-Math-72B-Instruct和GPT4-o,甚至是非常小的专业模型如 Qwen2.5-Math-1.5B-Instruct也能在与大型语言模型的竞争中取得高度竞争力的表现。近来也出现了明显的转向小型语言模型(SLMs)的趋势。

搏博的专栏 1万+

Golang 读文件

Golang 读文件

wgchen 1239

ANSYS workbench (关于normal stiffness factor接触刚度因子)

关于normal stiffness factor接触刚度因子的含义和设置方法

weixin_43730845的博客 6799

Golang读取单行超长的文本

前言: 最近在探索用Go来读取文件,读取文本时发现,对于单行超长的文本,我的Go代码无法处理。经过查阅才发现,Go提供的Scanner无法读取单行超长文本文件。我这里就来总结一下问题的发现和解决过程。 1.问题复现 首先注释main函数里面的内容,执行 CreateBigText 函数,它会创建一个含有3行内容的文件,第一行是一个长度超过100KB的行。然后解决main函数的注释,尝试执行代码,会发现只有一行错误信息: package main import ( "bufio" "bytes" "

qq_40734247的博客 2084

【RT-DETR有效改进】为什么YOLO版本的RT-DETR训练模型不收敛精度差的问题

本文的内容同样为本专栏的前期预热文章,文章主要解释一下为什么有的人跑ultralytics仓库的RT-DETR精度很差,模型不收敛,mAP异常的情况。为了验证这一情况我也是跑了多个实验,从多个数据集出发,100-500的数据集我跑了大概5个数据集,1000的我跑了二个,2000的我跑了一个,4000的跑了一个,同时其中一些版本我也用了不同的batch_size来出发验证精度异常的情况。

Snu77的博客 9759

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

go - 文件的copy与读写

【代码】go - 文件的copy与读写。

weixin_62331305的博客 361

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

go语言 第三方包安装方法_【分享吧】Go语言第三方包的使用介绍与场景应用

Go语言是一种跨平台(Mac OS、Windows、Linux 等)的静态编译型语言。拥有媲美C语言的强大性能,支持静态类型安全,在普通计算机上能几秒内快速编译一个大项目,开发效率跟动态语言相差无几。Go语言在国内拥有非常活跃的社区,未来发展十分看好。当前Go语言主要应用于后端服务的开发,未来随着Go项目的完善,在系统、游戏、UI界面、AI、物联网等领域,都将被广泛使用。当我们在开发实现...

weixin_39760650的博客 1270

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

GoLang之读取文件10种的方法

读取文件的 10 种方法

weixin_52690231的博客 2万+

golang读取文件的常用方法

//按字节读取,将整个文件读取到缓冲区buffer func test1() { file,err := os.Open("filetoread.txt") if err != nil { log.Fatal(err) } defer file.Close() fileinfo,err := file.Stat() if err != nil { log.Fatal(err)

skh2015java的博客 1万+

Go 语言读取文件的几种方式

本文介绍了 Go 语言读取文件的几种方式,函数将整个文件读成一个字符串。这个函数很方便,但不应该用于非常大的文件。希望能对你有所帮助!

金戈鐡馬 1988

Go语言逐行读取文件的三种方法

Go语言行读取方法介绍

信道者 1万+

Go中配置文件读取的几种方式

日常开发中读取配置文件包含以下几种格式: json 格式字符串 K=V 键值对 xml 文件 yml 格式文件 toml 格式文件 前面两种书写简单,解析过程也比较简单。xml形式书写比较累赘,yml是树形结构,为简化配置而生,toml是一种有着自己语法规则的配置文件格式,我们一一来看使用方式,各位看官自行比较哪种更加实用。 1.读取json格式的文件 package main import...

rickiyang的博客 1万+

Golang读取文件和处理超大文件方案

文章目录1. 文件整体读取代码示例1代码示例22. 文件分片读取代码示例3. 文件逐行读取示例代码1代码示例24. 总结5. 参考资料 Golang 操作文件的读取的方法很多,适用的场景也是各不相同,在此我们将文件的读取分为如下几种 : 文件整体读取 文件分片读取(块级读取) 文件行级读取 系统的配置不同,执行的耗时也不相同,此处给出一参考 系统配置 : OS : Windows10 Memory : 16G CPU (英特尔)Intel® Core™ i3-4370 CPU @ 3.80GHz

Gcaptain 7533

Go语言读取文件方法大总结

在 Golang 中读取文件。我们将使用以下包来处理这些文件。os包提供了一个独立于平台的接口来执行操作级操作。IOutil软件包提供了易于使用的实用程序函数来处理文件,而无需了解太多内部实现。bufio包实现了缓冲 IO,这有助于我们提高输入和输出操作的性能和吞吐量。log包实现一个简单的日志记录包。我们将在整个程序中使用它。我们将在程序中使用日志包的Fatal()函数。本文介绍了 Go 语言读取文件的几种方式,函数将整个文件读成一个字符串。这个函数很方便,但不应该用于非常大的文件。

s44359487yad的博客 1046

golang中go build 后读取配置文件

golang中go build 后读取配置文件,**问题的根本原因是:** 当你在开发时依赖相对路径加载配置文件,但在打包程序后,程序的工作目录和资源文件的路径不再一致,导致无法找到配置文件。 **解决方法:** 通过动态获取可执行文件的路径,然后根据程序所在目录计算出资源文件(如配置文件)的路径。这样可以确保无论程序从哪里运行,都能够准确找到相应的配置文件

席万里的博客 2224

go按行读取文件的几种实现方式

目录1. 使用ioutil读取文本2. 使用bufio.Reader的ReadLine读取3.使用bufio.Scanner读取 实现方式:使用iouitl一次性读取全部文件内容,然后使用"\n"进行分割成行。这种实现最简单,但是只适合都内容比较小的文件,当读取大文件的时候,一次读到内存需要占用比较大的内存。 实现方式:使用NewReader创建bufio.Reader,循环调用Reader的ReadLine按行读取,直接读到文件结束标记EOF。bufio.Reader封装了io, 并实现了缓冲I/

程序猿CKeen的专栏 8345
上一篇: go中的并发
下一篇: go读取yaml,json,ini等配置文件
Cc_sec
博客等级 码龄8年 6粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值