首页 > 其他分享 >Go 文件操作-读写文件

Go 文件操作-读写文件

时间:2024-03-19 21:35:47浏览次数:22  
标签:文件 file func err 读写 bufio Go os fmt

Go 文件操作-读写文件

Go读取文件

整个文件读取进内存(适合读小文件)

1. 直接指定文件名读取

os.ReadFile()

ioutil.ReadFile() (在 Go 1.16 开始,ioutil.ReadFile() 就等价于 os.ReadFile())
package main

import (
	"fmt"
	"os"
)

func main() {
	bytes, err := os.ReadFile("./Readme.md")
	if err != nil {
		fmt.Println("os.ReadFile err=", err)
	}

	fmt.Println(string(bytes))
}

2. 先创建文件句柄再读取

可以使用 os.Open() 或者 os.OpenFile() 创建文件句柄

io.ReadAll() (在 Go 1.16 开始,ioutil.ReadAll() 就等价于 io.ReadAll())
package main

import (
	"fmt"
	"io"
	"os"
)

func main() {
	file, err := os.Open("./Readme.md")
	if err != nil {
		fmt.Println("os.Open err=", err)
	}
	defer file.Close()

	bytes, err := io.ReadAll(file)
	if err != nil {
		fmt.Println("io.ReadAll err=", err)
	}

	fmt.Println(string(bytes))
}

使用缓冲,每次只读一行(适合读大文件,不通用)

使用 bufio.NewReader() 构建 Reader 实例

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

func (*bufio.Reader) ReadBytes('\n')(并不是所有的文件都有换行符 \n)
func (*bufio.Reader) ReadString('\n')(并不是所有的文件都有换行符 \n)
package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
)

func main() {
	file, err := os.Open("./Readme.md")
	if err != nil {
		fmt.Println("os.Open err=", err)
	}

	defer file.Close()

	r := bufio.NewReader(file)

	for true {
		lineBytes, err := r.ReadBytes('\n')

		//line := strings.TrimSpace(string(lineBytes))

		// 特别注意!
		// 如果ReadBytes在查找分隔符之前遇到错误,
		// 它会返回错误之前读取的数据和错误本身(通常为io.EOF)
		// 所以需要注意错误的判断条件 和 读取文件操作代码的位置
		if err != nil && err != io.EOF {
			fmt.Println("r.ReadBytes err=", err)
		}

		// 应在 break 之前
		fmt.Printf(string(lineBytes))

		if err == io.EOF {
			break
		}
	}

}

package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
)

func main() {
	file, err := os.Open("./Readme.md")
	if err != nil {
		fmt.Println("os.Open err=", err)
	}

	defer file.Close()

	r := bufio.NewReader(file)

	for true {
		lineStr, err := r.ReadString('\n')

		//line := strings.TrimSpace(string(lineBytes))

		// 特别注意!
		// 如果ReadBytes在查找分隔符之前遇到错误,
		// 它会返回错误之前读取的数据和错误本身(通常为io.EOF)
		// 所以需要注意错误的判断条件 和 读取文件操作代码的位置

		// 可以先读取文件 打印  方便后面的错误处理
		fmt.Printf(lineStr)

		if err == io.EOF {
			break
		}

		if err != nil {
			fmt.Println("r.ReadString err=", err)
		}
	}

}

使用缓冲,每次只读固定字节数(适合读大文件,通用)

  1. 先创建一个文件句柄,可以使用 os.Open() 或者 os.OpenFile()
  2. 然后 bufio.NewReader() 创建一个 Reader
  3. 然后在 for 循环里调用 Reader 的 Read() 函数,每次仅读取固定字节数量的数据。
package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
)

func main() {
	file, err := os.Open("./Readme.md")
	if err != nil {
		fmt.Println("os.Open err=", err)
	}

	defer file.Close()

	r := bufio.NewReader(file)

	buf := make([]byte, 1024)

	for true {
		//Read读取数据写入buf。
		//本方法返回写入buf的字节数。
		//本方法一次调用最多会调用下层Reader接口一次Read方法,
		//因此返回值n可能小于len(p)。
		//读取到达结尾时,返回值n将为0而err将为io.EOF。
		n, err := r.Read(buf)
		if err != nil && err != io.EOF {
			panic(err)
		}

		if n == 0 {
			break
		}

		// 注意转换string时 buf字节要取出确定的长度
		fmt.Println(string(buf[:n]))
	}
}

Go写文件

一次将全部内容写入文件

1. 指定文件名,不存在则创建文件后写入,存在则清空文件后写入

os.WriteFile()

ioutil.WriteFile() (在 Go 1.16 开始,ioutil.WriteFile() 就等价于 os.WriteFile())
package main

import (
	"fmt"
	"os"
)

func main() {
	err := os.WriteFile("abc.text", []byte("hello,world"), 0666)
	if err != nil {
		fmt.Println("os.WriteFile err=", err)
	}
}

2. 先创建文件句柄再写入

可以使用 os.Create() 或者 os.OpenFile() 创建文件句柄

func (*File) Write()

func (*File) WriteAt()

func (*File) WriteString()
package main

import (
	"fmt"
	"os"
)

func main() {

	file, err := os.Create("abc.text")
	if err != nil {
		fmt.Println("os.Create err=", err)
	}
	defer file.Close()

	n, err := file.Write([]byte("How are you"))
	if err != nil {
		fmt.Println("file.Write err=", err)
	}

	fmt.Println(n)
}

使用缓冲

可以使用 os.Create() 或者 os.OpenFile() 创建文件句柄
使用 bufio.NewWriter() 构建 Writer 实例

func (*bufio.Writer) WriteString() + func (*bufio.Writer) Flush()
package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	file, err := os.Create("abc.text")
	if err != nil {
		fmt.Println("os.Create err=", err)
	}
	defer file.Close()

	w := bufio.NewWriter(file)

	for i := 0; i < 10; i++ {
		n, err := w.WriteString("I am fine\n")
		if err != nil {
			fmt.Println("file.Write err=", err)
		}
		fmt.Println(n) //
	}

	err = w.Flush()
	if err != nil {
		fmt.Println("w.Flush err=", err)
	}

}

方法总结

一次性读写,且不使用文件句柄 os.ReadFile() os.WriteFile()
一次性读写,使用文件句柄 os.Open() + io.ReadAll() os.Create() + func (*File) WriteString()
使用缓冲 os.Open() + bufio.NewReader() + func (*bufio.Reader) Read() os.Create() + bufio.NewWriter() + func (*bufio.Writer) WriteString() + func (*bufio.Writer) Flush()

标签:文件,file,func,err,读写,bufio,Go,os,fmt
From: https://www.cnblogs.com/dibtp/p/18083986

相关文章

  • Solon Web 文件上传的最佳实践
    文件上传是Web开发中最常见的一个应用场景。一般在处理数据时,会有两种常见的方案:直接把文件流放在内存里,或者把文件流先缓冲到磁盘。1、如果是高频且文件极小使用纯内存模式,默认即可。如果高频小文件,是不适合用“临时文件模式”的,磁盘可能容易刷坏。只能多配些内存!2、如果是......
  • 'vue' 不是内部或外部命令,也不是可运行的程序 或批处理文件解决方法
    查看信息npmconfiglist根据prefix路径,查看是否有'vue.cmd'文件参考了这篇感觉很整齐如果没有就安装vuenpminstall-gvue再安装脚手架vue-cli//安装npminstall-g@vue/cli//或者cnpminstall-g@vue/cli//或者yarnglobaladd@vue/cli然后配置环境变......
  • Go语言的隐式契约:探索接口无声的实现
    在讨论Go语言的特性时,我们常常会提到一个独特之处:Go语言中并没有显式的implement关键字用于表明一个类型实现了某个接口。这一点与许多其他面向对象编程语言形成了鲜明对比,比如Java或C#中,实现接口需要明确声明。然而,Go语言采取了一种更加隐式的方式来处理接口和类型之间的关......
  • Go: 泛型及其应用详解
    在软件开发的世界里,泛型是一个强大的工具,它允许我们编写灵活且可重用的代码。对于我们这些追求成为软件架构师和系统架构师的开发者来说,深入理解并有效应用泛型是提升我们代码设计能力的关键一步。Go语言自1.18版本起正式引入了泛型功能,这一变化无疑给Go语言带来了更广阔的......
  • snownlp的原始评论文件直方图分析
    SnowNLP是一个专门为处理中文文本而创建的Python自然语言处理库。它是由isnowfy开发并在GitHub上开源的一个项目,地址为 https://github.com/isnowfy/snownlp 。SnowNLP受TextBlob库的启发,但针对中文文本处理的特点进行了定制化设计,并且没有依赖NLTK(NaturalLanguage......
  • Django项目记录
    在线教育平台Django项目#manage.pyos.environ.setdefault("DJANGO_SETTINGS_MODULE","mxonline.settings")是什么意思?这行代码是用于设置Django项目的配置模块。在Django项目中,有一个名为settings.py的文件,其中定义了项目的各种配置选项。DJANGO_SETTINGS_MODULE是一个环境变......
  • zip文件
    zip文件的格式压缩源文件数据区504B0304压缩源目录数据区504B0102目录结束标志504B0506伪加密和真加密的区别真加密zip文件(压缩源文件数据区的全局方式位标志和压缩源目录区的全局方式位标志都不是0000,一般是0900) 伪加密zip文件(只有在压缩源目录数据区的全局方式......
  • jmeter-文件上传02
    内容详情:1.资料发布,分为资料上传和资料保存两个请求,资料上传的返回的接口中file_id是资料保存的请求的参数资料上传抓包:   资料保存抓包     tips:在这个过程遇到的坑1.写了全局的http信息头,但这两个请求跟之前其他请求的请求头部不一样,导致一......
  • 02_STM32软件+硬件SPI读写W25Q64(HAL库)
    目录1、SPI简介2、SPI时序单元2.1模式0(应用最多)2.2模式12.3 模式22.4 模式33、SPI移位示意图4、简单软件SPI代码(HAL库)5、简单硬件SPI读写W25Q64(HAL库)6、例程下载1、SPI简介2、SPI时序单元2.1模式0(应用最多)2.2模式12.3 模式2模式2与模式0类似,区别在......
  • Google Earth Engine——如何实现裁剪后研究区影像的批量下载(以NDVI为例)
    简介GEE云平台(GoogleEarthEngine)是一个强大的云平台,提供了丰富的地理数据和计算资源,用于进行地理数据分析和处理。在GEE平台上,可以实现对研究区影像的单景影像(以NDVI为例)的批量下载。下面是具体的过程:1.登录GEE云平台并初始化首先,需要登录GEE云平台(https://earthengine.g......