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。
相关文章:
golang的文件操作
获取文件列表路径 package _caseimport ("fmt""log""os""strings" )// 获取文件路径 // 源文件目录 const sourceDir "file/"// 目标文件目录 const destDir "det_file/"// 拿到目录下完整的路径 func geFiles…...

数据库版本管理框架-Flyway(从入门到精通)
一、flyway简介 Flyway是一个简单开源数据库版本控制器(约定大于配置),主要提供migrate、clean、info、validate、baseline、repair等命令。它支持SQL(PL/SQL、T-SQL)方式和Java方式,支持命令行客户端等&am…...

外网访问内网服务器使用教程
如何在任何地方都能访问自己家里的笔记本上的应用?如何让局域网的服务器可以被任何地方访问到?有很多类似的需求,我们可以统一用一个解决方案:内网穿透。内网穿透的工具及方式有很多,如Ngrok、Ssh、autossh、Natapp、F…...
C# Dictionary 利用 ContainsValue 查询指定值是否已经存在
.NET Framework : 4.7.2IDE : Visual Studio Community 2022OS : Windows 10 x64typesetting : Markdownblog : niaoge.blog.csdn.net 简介 本文介绍如何查询Dictionary 中某个值是否已经存在。 ContainsValue 命名空间: System.Collections.Generic 程序集: System.Collect…...

招不到人?用C语言采集系统批量采集简历
虽说现在大环境不太好,很多人面临着失业再就业风险,包括企业则面临着招人人,找对口专业难得问题。想要找到适合自己公司的人员,还要得通过爬虫获取筛选简历才能从茫茫人海中找到公司得力干将。废话不多说,直接开整。 1…...

HXDSP2441-Demo板
板卡图示 下图为HXDSP2441DEMO板,HXDSP2441DEMO板是围绕HXDSP2441构建的芯片演示验证平台。 板卡简介 除了为HXDSP2441芯片提供供电、时钟、储存、网络及调试电路,来实现芯片最基本的功能,也添加了相关模块以搭建HXDSP2441的典型应用场景…...

静态路由的原理和配置
一.路由器的工作原理 首先我们知道路由器是工作在网络层的,那就是三层设备。网络层的功能主要为:不同网段之间通信、最佳路径选择也就是逻辑地址(ip地址)寻址、转发数据。 1.路由器是什么 路由器是能将数据包转发到正确的目的地…...

Ubuntu20.04降低linux版本到5.4.0-26-generic
前言 试用ubuntu20.04安装昇腾的驱动和cann的时,出现如下问题: (base) rootubuntu:/home/work# ./Ascend-hdk-910-npu-driver_23.0.rc3_linux-aarch64.run --full Verifying archive integrity... 100% SHA256 checksums are OK. All good. Uncompr…...
C++ 类型萃取
什么是 type_traits 在C中,类型萃取(type_traits)是一种编译时技术,用于在编译期间获取和操作类型的信息。 主要用于泛型编程以及在编译时做出决策。 类型萃取可以帮我们检查和处理类型特性,从而优化代码、避免错误或…...

【JVM从入门到实战】(四)类的生命周期
什么是类的生命周期 类的生命周期描述了一个类加载、连接、初始化、使用、卸载的整个过程 一个类完整的生命周期如下: 加载阶段 加载阶段第一步是类加载器根据类的全限定名通过不同的渠道以二进制流的方式获取字节码信息。 程序员可以使用Java代码拓展的不同的渠道…...

2023年度美食关键词-葱油花卷
2023年即将过去了,总结这一年的美食关键词,对于我来就,应该就是-大葱了。 前一周,朋友送了我5大葱,在北方,大葱是家家户户必不可少的食材,尤其对于面食爱好者来说,大葱的加入无疑让…...

「Verilog学习笔记」简易秒表
专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 timescale 1ns/1nsmodule count_module(input clk,input rst_n,output reg [5:0]second,output reg [5:0]minute);always (posedge clk or negedge rst_n) begin if (~rst…...
《每天一个Linux命令》 -- (12) file命令
欢迎阅读《每天一个Linux命令》系列 !在本篇文章中,将说明file命令用法。 概念 file命令是Linux系统下的文件类型识别命令,用于识别文件的类型。 命令操作 file命令的语法如下: file [选项] 文件命令详细解释 以下是 file 命…...

如何使用ArcGIS Pro制作类似CAD的尺寸注记
经常使用CAD制图的朋友应该比较熟悉CAD内的尺寸标注,这样的标注看起来直观且简洁,那么在ArcGIS Pro内能不能制作这样尺寸注记呢,答案是肯定的,这里为大家介绍一下制作的方法,希望能对你有所帮助。 数据来源 本教程所…...
Go语言bufio包的使用
准备文本文件 rpc_intro.txt RPC(Remote Procedure Call,远程过程调用)是一种计算机通信协议, 允许调用不同进程空间的程序。RPC 的客户端和服务器可以在一台机器上,也可以在不同的机器上。程序员使用时,就像调用本地程序一样&…...

计算机网络之IP篇
来源自小林Coding博客,阅读后部分精简笔记 目录 一、IP 的基本认识 二、DNS 三、ARP 四、DHCP 五、NAT 六、ICMP 七、IGMP 七、ping 的工作原理 ping-----查询报文的使用 traceroute —— 差错报文类型的使用 八、断网了还能 ping 通 127.0.0.1 吗&…...
Java中JDK类库常用的6种设计模式
Java中JDK类库常用的6种设计模式:1、抽象工厂。2、建造者模式。3、工厂模式。4、原型模式。5、单例模式。6、适配器模式。 1、抽象工厂 javax.xml.parsers.DocumentBuilderFactory抽象类。 public static DocumentBuilderFactory newInstance()方法。 类功能&…...
C++ 用法全面剖析
我们知道,参数的传递本质上是一次赋值的过程,赋值就是对内存进行拷贝。所谓内存拷贝,是指将一块内存上的数据复制到另一块内存上。 对于像 char、bool、int、float 等基本类型的数据,它们占用的内存往往只有几个字节,对…...
数据库结构
三级结构 内模式:也称为物理模式,它是数据库中数据的物理存储表示,描述了数据在存储介质上的存储方式和物理结构,通常由数据库管理员进行定义。 概念模式:也称为逻辑模式,它是对数据库中全体数据的逻辑表示…...
什么是HTML以及超链接,特殊符号转义的简单使用
目录 什么是HTML🌸 HTML版本 版本说明🌸 XHTML和HTML的区别 超链接🌸基本语法🌸链接的分类 特殊符号 什么是HTML HTML 不是编程语言,没有逻辑处理能力,没有计算能力,不能动态地生成内容&#x…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...

jdbc查询mysql数据库时,出现id顺序错误的情况
我在repository中的查询语句如下所示,即传入一个List<intager>的数据,返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致,会导致返回的id是从小到大排列的,但我不希望这样。 Query("SELECT NEW com…...

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡
何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡 背景 我们以建设星云智控官网来做AI编程实践,很多人以为AI已经强大到不需要程序员了,其实不是,AI更加需要程序员,普通人…...
数据库正常,但后端收不到数据原因及解决
从代码和日志来看,后端SQL查询确实返回了数据,但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离,并且ai辅助开发的时候,很容易出现前后端变量名不一致情况,还不报错,只是单…...

VSCode 使用CMake 构建 Qt 5 窗口程序
首先,目录结构如下图: 运行效果: cmake -B build cmake --build build 运行: windeployqt.exe F:\testQt5\build\Debug\app.exe main.cpp #include "mainwindow.h"#include <QAppli...
手动给中文分词和 直接用神经网络RNN做有什么区别
手动分词和基于神经网络(如 RNN)的自动分词在原理、实现方式和效果上有显著差异,以下是核心对比: 1. 实现原理对比 对比维度手动分词(规则 / 词典驱动)神经网络 RNN 分词(数据驱动)…...