在Golang开发中,处理CSV文件是常见的需求,无论是导入批量数据还是导出统计结果都可能用到相关操作。Golang标准库自带的encoding/csv包提供了完善的CSV处理能力,无需引入第三方依赖就能完成文件的读取和写入操作。

Golang读取CSV文件的基本步骤
读取CSV文件的核心是使用csv.NewReader创建读取器,然后逐行或者一次性读取所有内容。首先我们需要导入对应的包,然后打开目标CSV文件。
package main
import (
"encoding/csv"
"fmt"
"os"
)
func main() {
// 打开CSV文件
file, err := os.Open("test.csv")
if err != nil {
fmt.Println("打开文件失败:", err)
return
}
defer file.Close()
// 创建CSV读取器
reader := csv.NewReader(file)
// 设置读取的逗号分隔符,默认是逗号,如果是其他分隔符可以修改
// reader.Comma = 't' // 如果是制表符分隔的TSV文件可以设置这个
// 读取所有行
records, err := reader.ReadAll()
if err != nil {
fmt.Println("读取CSV内容失败:", err)
return
}
// 遍历输出每一行内容
for index, row := range records {
fmt.Printf("第%d行内容: %vn", index+1, row)
}
}
逐行读取CSV文件
如果CSV文件体积较大,一次性读取所有内容可能会占用过多内存,这时候可以选择逐行读取的方式。修改上面的代码,使用Read方法每次读取一行数据。
package main
import (
"encoding/csv"
"fmt"
"os"
)
func main() {
file, err := os.Open("test.csv")
if err != nil {
fmt.Println("打开文件失败:", err)
return
}
defer file.Close()
reader := csv.NewReader(file)
// 跳过表头,如果CSV第一行是表头的话
header, err := reader.Read()
if err != nil {
fmt.Println("读取表头失败:", err)
return
}
fmt.Println("表头内容:", header)
// 逐行读取剩余内容
for {
row, err := reader.Read()
if err != nil {
// 读到文件末尾时err会是io.EOF
if err.Error() == "EOF" {
break
}
fmt.Println("读取行失败:", err)
return
}
fmt.Println("当前行内容:", row)
}
}
Golang写入CSV文件的操作方法
写入CSV文件需要使用csv.NewWriter创建写入器,然后将数据按行写入到目标文件中。写入完成后需要调用Flush方法确保数据全部写入文件。
package main
import (
"encoding/csv"
"fmt"
"os"
)
func main() {
// 创建或打开要写入的CSV文件
file, err := os.Create("output.csv")
if err != nil {
fmt.Println("创建文件失败:", err)
return
}
defer file.Close()
// 创建CSV写入器
writer := csv.NewWriter(file)
defer writer.Flush()
// 准备要写入的数据,第一行可以是表头
header := []string{"姓名", "年龄", "城市"}
err = writer.Write(header)
if err != nil {
fmt.Println("写入表头失败:", err)
return
}
// 写入多行数据
data := [][]string{
{"张三", "25", "北京"},
{"李四", "30", "上海"},
{"王五", "28", "广州"},
}
err = writer.WriteAll(data)
if err != nil {
fmt.Println("写入数据失败:", err)
return
}
fmt.Println("CSV文件写入完成")
}
自定义CSV写入参数
如果需要自定义CSV的分隔符、换行符等参数,可以直接修改写入器的属性。比如写入使用分号分隔的CSV文件,可以这样设置:
package main
import (
"encoding/csv"
"fmt"
"os"
)
func main() {
file, err := os.Create("semicolon_output.csv")
if err != nil {
fmt.Println("创建文件失败:", err)
return
}
defer file.Close()
writer := csv.NewWriter(file)
// 设置分隔符为分号
writer.Comma = ';'
defer writer.Flush()
row := []string{"产品A", "100", "50.5"}
err = writer.Write(row)
if err != nil {
fmt.Println("写入失败:", err)
return
}
fmt.Println("自定义分隔符的CSV写入完成")
}
常见问题与注意事项
- 读取CSV文件时要注意文件的编码格式,encoding/csv包默认支持UTF-8编码,如果是其他编码的文件需要先转码再处理。
- 写入CSV时如果字段中包含分隔符、换行符或者双引号,csv包会自动对字段进行转义处理,不需要手动操作。
- 操作文件后一定要记得关闭文件,并且写入完成后要调用Flush方法,否则可能出现数据没有完全写入文件的情况。
- 如果CSV文件是从Windows系统生成的,可能存在BOM头,读取前需要先处理BOM头避免解析错误。
GolangCSV文件读写encoding_csv修改时间:2026-07-22 10:33:11