Go (Golang) 中的 CSV 操作:encoding/csv 完全指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Go (Golang) 中的 CSV 操作:完全指南



CSV(逗号分隔值)是交换表格数据最常用的格式之一。在 Go (Golang) 语言中,CSV 操作通过标准包 encoding/csv 实现。它提供了方便且高效的接口用于读取和写入 CSV 文件,支持分隔符设置、字符转义和错误处理。



在本文中,我们将通过实际示例详细解析 encoding/csv 包的所有功能。您将学习如何逐行或整体读取 CSV 文件、写入数据、配置解析参数以及处理常见错误。



安装与导入



encoding/csv 包是 Go 标准库的一部分,因此无需额外安装。只需在代码中导入即可使用:



import (    "encoding/csv"    "fmt"    "os")


读取 CSV 文件



读取 CSV 最简单的方法是使用 csv.NewReader 和 ReadAll 方法,该方法以字符串切片的形式返回所有记录。



func readAllExample(filename string) {    file, err := os.Open(filename)    if err != nil {        panic(err)    }    defer file.Close()

reader := csv.NewReader(file) records, err := reader.ReadAll() if err != nil { panic(err) }

for _, record := range records { fmt.Println(record) }}


对于大文件,最好使用 Read 方法逐行读取,以避免将整个文件加载到内存中:



func readLineByLine(filename string) {    file, err := os.Open(filename)    if err != nil {        panic(err)    }    defer file.Close()

reader := csv.NewReader(file) reader.LazyQuotes = true // 允许宽松的引号解析

for { record, err := reader.Read() if err != nil { break // 文件结束或出错 } fmt.Println(record) }}


写入 CSV 文件



写入数据使用 csv.NewWriter。Write 方法写入一条记录,WriteAll 方法一次性写入所有记录。别忘了调用 Flush() 刷新缓冲区。



func writeExample(filename string) {    file, err := os.Create(filename)    if err != nil {        panic(err)    }    defer file.Close()

writer := csv.NewWriter(file) defer writer.Flush()

data := [][]string{ {"姓名", "年龄", "城市"}, {"安娜", "28", "莫斯科"}, {"伊万", "35", "圣彼得堡"}, }

for _, record := range data { if err := writer.Write(record); err != nil { panic(err) } }}


设置分隔符和转义



默认情况下,encoding/csv 使用逗号作为分隔符,双引号用于转义。您可以通过 Reader 和 Writer 结构体的字段更改这些设置:



func customSettings() {    // 读取 TSV(制表符分隔值)    file, _ := os.Open("data.tsv")    defer file.Close()

reader := csv.NewReader(file) reader.Comma = '\\t' // 使用制表符代替逗号 reader.Comment = '#' // 忽略以 # 开头的行

records, _ := reader.ReadAll() fmt.Println(records)}


有用的配置字段:

  • Comma — 分隔符字符(默认为 ',')
  • Comment — 注释字符(以此字符开头的行将被忽略)
  • LazyQuotes — 允许宽松的引号解析
  • TrimLeadingSpace — 删除字段开头的空格
  • FieldsPerRecord — 期望的字段数量

推荐