跳转到主要内容

标签(标签)

资源精选(342) Go开发(108) Go语言(103) Go(99) angular(82) LLM(75) 大语言模型(63) 人工智能(53) 前端开发(50) LangChain(43) golang(43) 机器学习(39) Go工程师(38) Go程序员(38) Go开发者(36) React(33) Go基础(29) Python(24) Vue(22) Web开发(20) Web技术(19) 精选资源(19) 深度学习(19) Java(18) ChatGTP(17) Cookie(16) android(16) 前端框架(13) JavaScript(13) Next.js(12) 安卓(11) typescript(10) 资料精选(10) NLP(10) 第三方Cookie(9) Redwoodjs(9) LLMOps(9) Go语言中级开发(9) 自然语言处理(9) 聊天机器人(9) PostgreSQL(9) 区块链(9) mlops(9) 安全(9) 全栈开发(8) ChatGPT(8) OpenAI(8) Linux(8) AI(8) GraphQL(8) iOS(8) 软件架构(7) Go语言高级开发(7) AWS(7) C++(7) 数据科学(7) whisper(6) Prisma(6) 隐私保护(6) RAG(6) JSON(6) DevOps(6) 数据可视化(6) wasm(6) 计算机视觉(6) 算法(6) Rust(6) 微服务(6) 隐私沙盒(5) FedCM(5) 语音识别(5) Angular开发(5) 快速应用开发(5) 提示工程(5) Agent(5) LLaMA(5) 低代码开发(5) Go测试(5) gorm(5) REST API(5) 推荐系统(5) WebAssembly(5) GameDev(5) CMS(5) CSS(5) machine-learning(5) 机器人(5) 游戏开发(5) Blockchain(5) Web安全(5) Kotlin(5) 低代码平台(5) 机器学习资源(5) Go资源(5) Nodejs(5) PHP(5) Swift(5) 智能体(4) devin(4) Blitz(4) javascript框架(4) Redwood(4) GDPR(4) 生成式人工智能(4) Angular16(4) Alpaca(4) SAML(4) JWT(4) JSON处理(4) Go并发(4) kafka(4) 移动开发(4) 移动应用(4) security(4) 隐私(4) spring-boot(4) 物联网(4) nextjs(4) 网络安全(4) API(4) Ruby(4) 信息安全(4) flutter(4) 专家智能体(3) Chrome(3) CHIPS(3) 3PC(3) SSE(3) 人工智能软件工程师(3) LLM Agent(3) Remix(3) Ubuntu(3) GPT4All(3) 软件开发(3) 问答系统(3) 开发工具(3) 最佳实践(3) RxJS(3) SSR(3) Node.js(3) Dolly(3) 移动应用开发(3) 编程语言(3) 低代码(3) IAM(3) Web框架(3) CORS(3) 基准测试(3) Go语言数据库开发(3) Oauth2(3) 并发(3) 主题(3) Theme(3) earth(3) nginx(3) 软件工程(3) azure(3) keycloak(3) 生产力工具(3) gpt3(3) 工作流(3) C(3) jupyter(3) 认证(3) prometheus(3) GAN(3) Spring(3) 逆向工程(3) 应用安全(3) Docker(3) Django(3) R(3) .NET(3) 大数据(3) Hacking(3) 渗透测试(3) C++资源(3) Mac(3) 微信小程序(3) Python资源(3) JHipster(3) 大型语言模型(2) 语言模型(2) 可穿戴设备(2) JDK(2) SQL(2) Apache(2) Hashicorp Vault(2) Spring Cloud Vault(2) Go语言Web开发(2) Go测试工程师(2) WebSocket(2) 容器化(2) AES(2) 加密(2) 输入验证(2) ORM(2) Fiber(2) Postgres(2) Gorilla Mux(2) Go数据库开发(2) 模块(2) 泛型(2) 指针(2) HTTP(2) PostgreSQL开发(2) Vault(2) K8s(2) Spring boot(2) R语言(2) 深度学习资源(2) 半监督学习(2) semi-supervised-learning(2) architecture(2) 普罗米修斯(2) 嵌入模型(2) productivity(2) 编码(2) Qt(2) 前端(2) Rust语言(2) NeRF(2) 神经辐射场(2) 元宇宙(2) CPP(2) 数据分析(2) spark(2) 流处理(2) Ionic(2) 人体姿势估计(2) human-pose-estimation(2) 视频处理(2) deep-learning(2) kotlin语言(2) kotlin开发(2) burp(2) Chatbot(2) npm(2) quantum(2) OCR(2) 游戏(2) game(2) 内容管理系统(2) MySQL(2) python-books(2) pentest(2) opengl(2) IDE(2) 漏洞赏金(2) Web(2) 知识图谱(2) PyTorch(2) 数据库(2) reverse-engineering(2) 数据工程(2) swift开发(2) rest(2) robotics(2) ios-animation(2) 知识蒸馏(2) 安卓开发(2) nestjs(2) solidity(2) 爬虫(2) 面试(2) 容器(2) C++精选(2) 人工智能资源(2) Machine Learning(2) 备忘单(2) 编程书籍(2) angular资源(2) 速查表(2) cheatsheets(2) SecOps(2) mlops资源(2) R资源(2) DDD(2) 架构设计模式(2) 量化(2) Hacking资源(2) 强化学习(2) flask(2) 设计(2) 性能(2) Sysadmin(2) 系统管理员(2) Java资源(2) 机器学习精选(2) android资源(2) android-UI(2) Mac资源(2) iOS资源(2) Vue资源(2) flutter资源(2) JavaScript精选(2) JavaScript资源(2) Rust开发(2) deeplearning(2) RAD(2)

注意 - 如果你对在 Go 中使用 JSON 感兴趣,你可能也喜欢我的其他教程 - Go JSON 教程

在本教程中,我们将了解如何使用 go 编程语言有效地读取和写入文件系统中的文件。

我们将用于读取和写入这些文件的方法将与文件格式无关。这意味着您将能够使用我们将介绍的技术来读取和写入 .txt、.csv、.xls 等,这些文件的唯一不同之处在于其结构您写入每种文件类型的数据。

读取文件


为了读取本地文件系统上的文件,您必须使用 io/ioutil 模块。您首先必须通过调用 ioutil.ReadFile("/path/to/my/file.ext") 将文件的内容拉入内存,这将获取您希望读取的文件的路径唯一的参数。这将返回文件的数据,或者可以像您通常处理 go 中的错误一样处理的错误。

创建一个名为 main.go 的新文件以及另一个名为 localfile.data 的文件。将一段随机文本添加到 .data 文件中,以便我们完成的 go 程序可以读取一些内容,然后执行以下操作:

package main

// import the 2 modules we need
import (
    "fmt"
    "io/ioutil"
)

func main() {
    // read in the contents of the localfile.data
    data, err := ioutil.ReadFile("localfile.data")
    // if our program was unable to read the file
    // print out the reason why it can't
    if err != nil {
        fmt.Println(err)
    }

    // if it was successful in reading the file then
    // print out the contents as a string
    fmt.Print(string(data))

}

将此 go 代码添加到 main.go 文件后,请尝试通过调用来运行它:

> go run main.go
this has all my content%


如您所见,我们已经成功地读取了存储在我们专有的 localfile.data 文件类型中的所有数据。

将文件写入新文件


现在我们已经介绍了在 Go 中读取文件,是时候看看创建和写入我们自己的文件了!

为了使用 Go 将内容写入文件,我们必须再次利用 io/ioutil 模块。我们首先必须构造一个字节数组来表示我们希望存储在文件中的内容。

mydata := []byte("all my data I want to write to a file")


一旦我们构建了这个字节数组,我们就可以调用 ioutil.WriteFile() 将这个字节数组写入文件。 WriteFile() 方法接受 3 个不同的参数,第一个是我们要写入的文件的位置,第二个是我们的 mydata 对象,第三个是 FileMode,它代表我们文件的模式和权限位。

// the WriteFile method returns an error if unsuccessful
err := ioutil.WriteFile("myfile.data", mydata, 0777)
// handle this error
if err != nil {
  // print it out
  fmt.Println(err)
}

让我们扩展我们原来的 main.go 文件,不仅可以读取,还可以写入文件:

package main

import (
    "fmt"
    "io/ioutil"
)

func main() {

    mydata := []byte("All the data I wish to write to a file")

    // the WriteFile method returns an error if unsuccessful
    err := ioutil.WriteFile("myfile.data", mydata, 0777)
    // handle this error
    if err != nil {
        // print it out
        fmt.Println(err)
    }

    data, err := ioutil.ReadFile("myfile.data")
    if err != nil {
        fmt.Println(err)
    }

    fmt.Print(string(data))

}

如果您现在尝试通过调用 go run main.go 来运行它,您应该会看到在您的当前目录中自动创建了一个名为 myfile.data 的新文件,并且我们的 go 程序继续从这个新创建的文件中读取并打印内容控制台:

➜ go run main.go
All the data I wish to write to a file


写入现有文件


如果我们有一个想要写入附加信息的现有文件会发生什么?

现在让我们来看看。

package main

import (
    "fmt"
    "io/ioutil"
    "os"
)

func main() {

    mydata := []byte("All the data I wish to write to a file\n")

    // the WriteFile method returns an error if unsuccessful
    err := ioutil.WriteFile("myfile.data", mydata, 0777)
    // handle this error
    if err != nil {
        // print it out
        fmt.Println(err)
    }

    data, err := ioutil.ReadFile("myfile.data")
    if err != nil {
        fmt.Println(err)
    }

    fmt.Print(string(data))

    f, err := os.OpenFile("myfile.data", os.O_APPEND|os.O_WRONLY, 0600)
    if err != nil {
        panic(err)
    }
    defer f.Close()

    if _, err = f.WriteString("new data that wasn't there originally\n"); err != nil {
        panic(err)
    }

    data, err = ioutil.ReadFile("myfile.data")
    if err != nil {
        fmt.Println(err)
    }

    fmt.Print(string(data))

}

现在您已经添加了新代码,我们可以通过运行我们的 main.go 文件来测试它:

$ go run main.go
All the data I wish to write to a file
new data that wasn't there originally


瞧!我们已经成功地使用 os.OpenFile 和 f.WriteString() 方法附加到现有文件。

文件权限


当您写入新文件时,了解您可用的各种不同文件权限非常重要。

注意 - 有关权限的更深入的文档,我建议查看:https://golang.org/pkg/os/#FileMode

结论


如果您了解在 Go 中读取和写入文件的基础知识,那么您就掌握了读取和写入任何可能的文件类型的基础知识,无论是 CSV、PNG 还是某些专有数据格式。您只需要知道这些数据的结构,以便您可以解析和修改以满足您的需求。

这就是我们将在本教程中介绍的全部内容,我们已经设法研究了一种非常简单的数据格式的读写。然后我们简要地查看了文件权限。

文章链接