golang的文件操作

获取文件列表路径

package _caseimport ("fmt""log""os""strings"
)// 获取文件路径
// 源文件目录
const sourceDir = "file/"// 目标文件目录
const destDir = "det_file/"// 拿到目录下完整的路径
func geFiles(dir string) []string {//读取目录fs, err := os.ReadDir(dir)if err != nil {log.Fatal()}//定义一个list接收我们的文件路径list := make([]string, 0)for _, f := range fs {//如果是个空的文件夹就继续if f.IsDir() {continue}//去掉字符串s中首部以及尾部与字符串cutset中每个相匹配的字符   //Name返回条目所描述的文件(或子目录)的名称。fullName := strings.Trim(dir, "/") + "/" + f.Name()list = append(list, fullName)fmt.Println(list)}return list
}

文件目录拷贝

package _case//文件复制
import ("io""log""os""path"
)// 拷贝目录到目录
func Copy() {list := geFiles(sourceDir)for _, f := range list {//Split 函数将路径从最后一个斜杠后面位置分隔为两个部分( dir 和 file )并返回。如果路径中没有斜杠,//函数返回值 dir 会设为空字符串, file 会设为 path 。两个返回值满足 path == dir+file_, name := path.Split(f)                 //把文件名输出destFileName := destDir + "copy/" + name //这个name是把文件名放在了目标文件加后//fmt.Println(destFileName)//复制文件CopyFile(f, destFileName)}
}func CopyFile(srcName, destName string) (int64, error) {//打开源文件src, err := os.Open(srcName)if err != nil {log.Fatal(err)}defer src.Close()//打开目标文件   可读可写可创建det, err := os.OpenFile(destName, os.O_CREATE|os.O_WRONLY, 0644)if err != nil {log.Fatal(err)}defer det.Close()return io.Copy(det, src)
}
一次性读取文件内容并写入

读取文件内容并写入

package _caseimport ("log""os""path"
)// 一次性读取文件内容并写入
func ReadWriteFiles() {//获取源文件路径list := geFiles(sourceDir)for _, f := range list {bytes, err := os.ReadFile(f)if err != nil {log.Fatal(err)}_, name := path.Split(f)destname := destDir + "normal/" + nameerr1 := os.WriteFile(destname, bytes, 0644)if err1 != nil {log.Fatal(err1)}}
}

分片读取文件并写入

package _caseimport ("io""log""os""path"
)// 适用大文件
// 分片读取文件内容分布写入新文件
func OneSideReadWriteToDest() {list := geFiles(sourceDir)for _, f := range list {_, name := path.Split(f)destFileName := destDir + "one_side/" + name//文件写入OneSideReadWrite(f, destFileName)}
}
func OneSideReadWrite(srcName, destName string) {src, err := os.Open(srcName)if err != nil {log.Fatal("1", err)}defer src.Close()dst, err := os.OpenFile(destName, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)if err != nil {log.Fatal("2", err)}defer dst.Close()//切片 文件最大的限度buf := make([]byte, 1024)for {n, err := src.Read(buf)if err != nil && err != io.EOF { //如果没有这个io.EOF的话就会报错log.Fatal("3...", err)}if n == 0 {break}dst.Write(buf[:n])}}

一次性读取按行拆分

const README = "README.MD"
func ReadLine1() {fileHeader, err := os.OpenFile(README, os.O_RDONLY, 0444)if err != nil {log.Fatal(err)}defer fileHeader.Close()//将文件一次性读取出来bytes, err := io.ReadAll(fileHeader)if err != nil {log.Fatal(err)}list := strings.Split(string(bytes), "\n")for _, i := range list {fmt.Println(i)}}

按行读取用于大文件

bufio 通过对io模块的封装提供了数据的缓冲功能,能一定程度减少大文件数据块带来的开销。当发起读写操作时,会尝试从缓冲区读取数据,缓冲区没有数据后,才会从数据源去读取缓冲区大小默认为4k

func ReadLine2() {fileHeader, err := os.OpenFile(README, os.O_RDONLY, 0444)if err != nil {log.Fatal(err)}defer fileHeader.Close()reader := bufio.NewReader(fileHeader)for true {//加上分隔符line, err := reader.ReadString('\n')if err == io.EOF {break}fmt.Print(line)}
}func ReadLine3() {fileHeader, err := os.OpenFile(README, os.O_RDONLY, 0444)if err != nil {log.Fatal(err)}defer fileHeader.Close()scanner := bufio.NewScanner(fileHeader)for scanner.Scan() {line := scanner.Text()fmt.Println(line)}
}

Scanner按行读取文件

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

func ReadLines(path string) ([]string, error) {file, err := os.Open(path)if err != nil {return nil, err}defer file.Close()var lines []stringscanner := bufio.NewScanner(file)for scanner.Scan() {lines = append(lines, scanner.Text())}return lines, scanner.Err()
}

Reader 读取每一行

使用 bufio.Reader 时,需用 ReadBytes() 或 ReadString() 方法来读取每一行。使用 NewReader() 函数创建一个 Reader 对象。在 for 循环中,我们使用 ReadString() 函数读取每一行的内容,并将其追加到字符串切片中。

func ReadLinesV2(path string) ([]string, error) {file, err := os.Open(path)if err != nil {return nil, err}defer file.Close()var lines []stringreader := 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
}

ReadLine 按行读取

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

func ReadLinesV3(path string) ([]string, error) {f, err := os.Open(path)if err != nil {return nil, err}defer f.Close()var lines []stringr := 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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/210648.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python数据科学视频讲解:数据挖掘与建模的注意事项

1.7 数据挖掘与建模的注意事项 视频为《Python数据科学应用从入门到精通》张甜 杨维忠 清华大学出版社一书的随书赠送视频讲解1.7节内容。本书已正式出版上市,当当、京东、淘宝等平台热销中,搜索书名即可。内容涵盖数据科学应用的全流程,包括…

sensitive word 敏感词(脏词) 如何忽略无意义的字符?达到更好的过滤效果?

忽略字符 说明 我们的敏感词一般都是比较连续的,比如 傻帽 那就有大聪明发现,可以在中间加一些字符,比如【傻!#$帽】跳过检测,但是骂人等攻击力不减。 那么,如何应对这些类似的场景呢? 我们可以指定特…

CSS3技巧36:让内容垂直居中的三种方式

让内容垂直居中,是一个很重要的应用情景,在很多场合都会需要。这也是面试的时候,一些考官喜欢拿来初面的小题目。 这里,小结下让内容垂直居中的三种方式。 当然,读者如果有更好的方法,也可以提出来。 基本…

基于ssm技术的车库智能管理平台论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本车库智能管理平台就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息…

【自定义Source、Sink】Flink自定义Source、Sink对redis进行读写操作

使用ParameterTool读取配置文件 Flink读取参数的对象 Commons-cli: Apache提供的,需要引入依赖ParameterTool:Flink内置 ParameterTool 比 Commons-cli 使用上简便; ParameterTool能避免Jar包的依赖冲突 建议使用第二种 使用Par…

西工大网络空间安全学院计算机网络实验五——ACL配置

实验五、ACL配置 一. 实验目的 1. 掌握ACL的基本配置方法 二. 实验内容 1. 基于如下图所示的拓扑图,对路由器进行正确的RIP协议配置; ​ 首先引入3台2811 IOS15型号的路由器、3台2950-T24型号的交换机、4台PC-PT型号的PC机、两台Server-PT型号的服务…

kafka学习笔记--生产者消息发送及原理

本文内容来自尚硅谷B站公开教学视频,仅做个人总结、学习、复习使用,任何对此文章的引用,应当说明源出处为尚硅谷,不得用于商业用途。 如有侵权、联系速删 视频教程链接:【尚硅谷】Kafka3.x教程(从入门到调优…

JavaScript 的节流与防抖

// 函数防抖: 在事件被触发 n 秒后再执行回调,如果在这 n 秒内事件又被触发,则重新计时。// 函数节流: 规定一个单位时间,在这个单位时间内,只能有一次触发事件的回调函数执行,如果在同一个单位…

Redis各种数据结构应用场景

Redis各种数据结构应用场景 一、基本类型 Redis的基本数据类型时,以下是它们的实际场景示例: 字符串(String): 实际场景 缓存数据:将频繁访问的数据缓存在Redis中,以提高读取速度。会话管理&…

Ubuntu与Windows通讯传输文件(FTP服务器版)(没用的方法,无法施行)

本文介绍再Windows主机上建立FTP服务器,并且在Ubuntu虚拟机上面访问Windows上FTP服务器的方法 只要按照上图配置就可以了 第二部:打开IIS管理控制台 右击网站,新建FTP站点。需要注意的一点是在填写IP地址的时候,只需要填写Window…

遥感卫星综述(下载和预处理)(持续更新)

遥感卫星综述(下载和预处理) 目录 遥感卫星综述(下载和预处理)一、国产卫星GF-1 WFV 二、国外卫星Sentinel-1Sentinel-2 一、国产卫星 GF-1 WFV 下载 分辨率波段16m4(蓝、绿、红、近红) 预处理: ENVI预处理GF-1号W…

用友T3如何反结账、反记账、反审核及删除凭证

在T3总账中已经进行了总账记账和月末结账,但是需要去修改凭证或删除凭证,这个时候就需要去进行反结账、反记账等操作,以下是具体的操作流程 第一步、反结账 1、进入用友T3件,打开总账系统模块,点月末结账&#xff0c…

uc_15_TCP协议

1 TCP协议 TCP提供客户机与服务器的链接。一个完整TCP通信过程需要经历三个阶段 1)首先,客户机必须建立与服务器的连接,所谓虚电路 2)然后,凭借已建立好的连接,通信双方相互交换数据 3)最后&am…

短信验证码无法获取,通过获取cookies直接登录

web端,selenium短信验证码无法获取,通过获取cookies直接登录 1,先获取cookies driver webdriver.Chrome() driver.get("") driver.implicitly_wait(2) # 获取弹窗,并取消 driver.find_element(By.XPATH,"/html/…

智能优化算法应用:基于粒子群算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于粒子群算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于粒子群算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.粒子群算法4.实验参数设定5.算法结果6.参考文…

Python---异常的综合案例

☆ 异常的传递 需求: ① 尝试只读方式打开python.txt文件,如果文件存在则读取文件内容,文件不存在则提示用户即可。 ② 读取内容要求:尝试循环读取内容,读取过程中如果检测到用户意外终止程序,则except捕…

个人博客网站如何实现https重定向(301)到http

对于个人网站站注册比较少的,服务器配置不是很好的,没必要https,https跳转到http是要时间的,会影响网站打开的速度。免费的https每年都要更换。个人博客网站https有一段时间了,而且很多页面都有收录排名,现在已去掉htt…

基于JavaWeb+SSM+Vue实习记录微信小程序系统的设计和实现

基于JavaWebSSMVue实习记录微信小程序系统的设计和实现 源码获取入口Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 Lun文目录 目 录 摘 要 III Abstract 1 1 系统概述 1 1.1 概述 2 1.2课题意义 3 1.3 主要内…

【Linux系统编程】进度条的编写

目录 一,进度条的必备知识 1,缓冲区的粗略介绍 2,回车与换行 二,进度条的初步制作 1,进度条的初步矿建 2,进度条的版本一 3,进度条的版本二 一,进度条的必备知识 1&#xff…

详细了解STM32----GPIO

提示:永远支持免费开源知识文档,喜欢的点个关注吧!谢谢! 文章目录 一、什么是GPIO?二、GPIO基本结构三、GPIO的输入输出模式1、推挽输出2、开漏输出3、复用推挽4、复用开漏1、浮空输入2、上拉输入3、下拉输…