go读取文件的几种方法
一. 整个文件读入内存
直接将数据直接读取入内存,是效率最高的一种方式,但此种方式,仅适用于小文件,对于大文件,则不适合,因为比较浪费内存
1.直接指定文化名读取
在 Go 1.16 开始,ioutil.ReadFile 就等价于 os.ReadFile,二者是完全一致的
1.1使用os.ReadFile函数读取文件
package mainimport ("fmt""os"
)func main() {content, err := os.ReadFile("a.txt")if err != nil {panic(err)}fmt.Println(string(content))
}
1.2使用ioutil.ReadFile函数读取文件
package mainimport ("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 mainimport (
"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 mainimport ("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)// 创建 Readerfor {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 mainimport ("bufio""fmt""io""os""strings"
)func main() {// 创建句柄fi, err := os.Open("a.txt")if err != nil {panic(err)}// 创建 Readerr := 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 mainimport ("bufio""fmt""io""os"
)func main() {// 创建句柄fi, err := os.Open("a.txt")if err != nil {panic(err)}// 创建 Readerr := 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 mainimport ("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.WaitGroupwg.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()
}相关文章:
go读取文件的几种方法
一. 整个文件读入内存 直接将数据直接读取入内存,是效率最高的一种方式,但此种方式,仅适用于小文件,对于大文件,则不适合,因为比较浪费内存 1.直接指定文化名读取 在 Go 1.16 开始,ioutil.Rea…...
ChatGPT癌症治疗“困难重重”,真假混讲难辨真假,准确有待提高
近年来,人工智能在医疗领域的应用逐渐增多,其中自然语言处理模型如ChatGPT在提供医疗建议和信息方面引起了广泛关注。然而,最新的研究表明,尽管ChatGPT在许多领域取得了成功,但它在癌症治疗方案上的准确性仍有待提高。…...
docker打包vue vite前端项目
打包vue vite 前端项目 1.打包时将测试删除 2.修改配置 3.打包项目 npm run build 显示成功(黄的也不知道是啥) 打包好的前端文件放入 4.配置 default.conf upstream wms-app {server 你自己的ip加端口 ;server 192.168.xx.xx:8080 ; } server { …...
zookeeper 查询注册的 dubbo 服务
1. 连接zookeeper 服务端 使用bin 目录下zk客户端连接服务器, ./zkCli.sh -server 127.0.0.1:2181 2. 查询Dubbo 服务 # 查询所有服务 ls /dubbo # 查询指定服务调用 ls /dubbo/服务名(接口地址)/consumers # 查询指定服务调用 ls /dubbo/服务名(接口地址)/pr…...
【每日一题】57. 插入区间
【每日一题】57. 插入区间 57. 插入区间题目描述解题思路 57. 插入区间 题目描述 给你一个 无重叠的 ,按照区间起始端点排序的区间列表。 在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可…...
youtubu视频下载和yt-dlp 使用教程
参考:https://zhuanlan.zhihu.com/p/618467617,使用 yt-dlp 下载 youtube 视频的一点体会 安装yt-dlp 1. 安装Python和ffmpeg Python:安装时把pip和添加系统环境变量都选上 ffmpeg:下载好exe文件,把目录添加到系统环…...
——滑动窗口
滑动窗口 所谓滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。也可以理解为一种双指针的做法。 leetcode76 class Solution {public String minWindow(String s, String t) {char[] schars s.toCharArray();char[] tc…...
【C++进阶】模板进阶
👦个人主页:Weraphael ✍🏻作者简介:目前学习C和算法 ✈️专栏:C航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞…...
Vim如何清空文件
在Vim中,可以使用以下命令清空文件内容: 打开需要清空的文件:在终端中输入vim filename打开文件,其中filename是你要编辑的文件名。 进入命令模式:按下键盘上的Esc键,确保处于Vim的命令模式。(…...
问道管理:什么信号?煤飞色舞钢花溅
近期重磅利好不断,对应到A股商场,究竟哪个板块最获益,商场讨论热烈。 地产分析师:方针力度超预期,主张加仓。 银行分析师:存量房贷对银行股心情上的压制完毕,值得重视。 消费分析师ÿ…...
C# PaddleDetection yolo 印章检测
效果 项目 代码 using OpenCvSharp; using OpenCvSharp.Extensions; using Sdcb.PaddleDetection; using Sdcb.PaddleInference; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq…...
常用框架分析(7)-Flutter
框架分析(7)-Flutter 专栏介绍Flutter核心思想Flutter的特点快速开发跨平台高性能美观的用户界面 Flutter的架构框架层引擎层平台层 开发过程使用Dart语言编写代码编译成原生代码热重载工具和插件 优缺点优点跨平台开发高性能美观的用户界面热重载强大的…...
清空 Docker 容器的日志文件
删除容器中netcore控制台存储到docker日志记录 在shell命令下执行如下语句: docker ps -aq | xargs docker inspect --format{{.LogPath}} | xargs truncate -s 0 这个命令会执行以下操作: docker ps -aq:列出所有容器的ID(包括…...
01-虚拟机安装Windows Server操作系统
1、创建并配置虚拟机 2、安装操作系统 找到windows Server镜像 等待安装 3、设置密码...
应用案例 | 基于三维机器视觉的机器人麻袋拆垛应用解决方案
Part.1 项目背景 在现代物流和制造行业中,麻袋的拆垛操作是一个重要且频繁的任务。传统的麻袋拆垛工作通常由人工完成,分拣效率较低,人力成本较高,现场麻袋堆叠、变形严重,垛型不规则、不固定,严重影响分…...
1018 Public Bike Management 结题记录(dfs剪枝)
个人觉得直接放入代码是最管用的。 其他方法类似,题意请参考其他博主。 #include <bits/stdc.h> using namespace std; const int N 1e4 50;int maxn 2000000000; int c, n, ed, s[N], m, minlen, needn, backn, pre[N]; bool flag, book[N]; vector<p…...
C++ deque底层原理
deque底层原理 一、目的二、底层实现三、原理图四、类结构五、push_back六、pop_back 一、目的 实现双端数组 二、底层实现 双向开口的连续线性空间 三、原理图 四、类结构 class deque : protected Deque base _Deque_base._Deque_impl M_map 指针数组 _M_map_size …...
打破对ChatGPT的依赖以及如何应对ChatGPT的错误和幻觉
OpenAI的ChatGPT是第一个真正流行的生成式AI工具,但它可能不是最好的。现在是时候扩大你的AI视野了。 ChatGPT成为了基于大语言模型(LLM)的聊天机器人的同义词。但是现在是时候停止对ChatGPT的痴迷,开始发现这个新世界中强大的替代品了。 首先&a…...
【git】【IDEA】在idea中使用git
目录 一、 在IDEA中配置git 二、 获取git仓库 2.1 本次初始化仓库 2.2 从远程仓库克隆 三、 本地仓库操作 3.1 将文件加入暂存区 3.2 将暂存区的文件提交到版本库 3.3 快捷键 使用快捷键 实现加入到暂存区与提交到版本库 3.4 查看日志 Show History 四、 远程仓库操…...
【设计模式】装饰者模式
目录 一、定义二、结构三、优点四、使用场景五、代码示例六、截图示例 一、定义 1.在不改变现有对象结构的情况下,动态给该对象添加额外功能的模式 2.类B继承于类A,并将类A作为B类的属性(B类聚合A类) 3.BufferedInputStream、Buff…...
PID控制在自动循迹小车中的实战应用与参数整定指南
PID控制在自动循迹小车中的实战应用与参数整定指南 当你在实验室里第一次看到自己设计的自动循迹小车歪歪扭扭地沿着黑线前进时,那种既兴奋又挫败的感觉一定记忆犹新。为什么理论上完美的PID算法,在实际应用中却总是出现超调、振荡或者响应迟缓ÿ…...
Win10+VS2019环境下vcpkg安装全攻略:从Git克隆到环境变量配置
Win10VS2019环境下vcpkg高效配置指南:从零搭建C开发环境 在Windows平台进行C开发时,第三方库的管理一直是令人头疼的问题。传统的手动下载、配置包含路径和链接库的方式不仅效率低下,还容易引发版本冲突。而vcpkg作为微软推出的跨平台C库管理…...
多语言交易所/外汇系统源码/合约/期权/杠杆合约 秒合约/理财/申购
支持控盈亏等等功能支持合约、期权两大交易品类(当前选中「期权」),以 XRP/USDT 为交易对示例,提供双向交易:买涨(做多):预判价格上涨时开仓盈利买跌(做空)&a…...
clusterProfiler进阶指南:如何利用R语言进行多组学数据的功能富集分析与可视化
clusterProfiler进阶指南:如何利用R语言进行多组学数据的功能富集分析与可视化 在生物信息学领域,功能富集分析是将高通量组学数据转化为生物学洞见的关键步骤。作为R/Bioconductor生态中的明星工具,clusterProfiler以其强大的分析能力和丰富…...
BilibiliDown高效音频提取实战指南:从问题解决到场景落地
BilibiliDown高效音频提取实战指南:从问题解决到场景落地 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirror…...
突破媒体捕获限制:猫抓cat-catch浏览器扩展全方位实战指南
突破媒体捕获限制:猫抓cat-catch浏览器扩展全方位实战指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓cat-catch是一款专注于网…...
利用快马平台快速搭建comfyui工作流原型,十分钟验证ai绘画创意
最近在尝试用ComfyUI搭建AI绘画工作流时,发现从零开始调试节点连接特别耗时。后来发现InsCode(快马)平台的AI生成功能能快速搭建原型,把验证周期从几小时缩短到十分钟,分享下具体实践: 为什么需要快速原型验证 传统ComfyUI工作流搭…...
LongCat-Video:136亿参数开源AI视频生成模型的技术突破与实践指南
LongCat-Video:136亿参数开源AI视频生成模型的技术突破与实践指南 【免费下载链接】LongCat-Video 项目地址: https://ai.gitcode.com/hf_mirrors/meituan-longcat/LongCat-Video 在人工智能视频生成领域,长视频生成一直是技术挑战的制高点。传统…...
Sulpho-Methyltetrazine-NHS ester,磺化甲基四嗪-琥珀酰亚胺酯的结构特点与功能
Sulpho-Methyltetrazine-NHS ester 是一种结合了磺酸基团、甲基四嗪和 NHS 酯三大功能模块的化学试剂,在生物化学和药物研发等领域具有广泛应用。以下是对其详细介绍:一、基本信息英文名称:Sulpho-Methyltetrazine-NHS ester(或 S…...
dockerc故障排除终极指南:10个常见错误和解决方案清单
dockerc故障排除终极指南:10个常见错误和解决方案清单 【免费下载链接】dockerc container image to single executable compiler 项目地址: https://gitcode.com/gh_mirrors/do/dockerc dockerc作为一款container image to single executable compiler工具&…...
