Golang如何写入CSV文件_Golang CSV文件读写实现方法
发布时间 - 2026-02-02 00:00:00 点击率:次最稳妥方式是用 encoding/csv 的 csv.Writer 配合 *os.File,需确保文件以 os.O_CREATE|os.O_WRONLY|os.O_TRUNC 模式打开、每行调用 wr.Write([]string{...})、写完必须 wr.Flush() 和 file.Close(),并按需在文件开头写入 UTF-8 BOM(\xEF\xBB\xBF)以兼容 Windows 记事本。
用 encoding/csv 写入 CSV 文件最稳妥
Go 标准库的 encoding/csv 是写入 CSV 的首选,它自动处理字段中的逗号、换行符和双引号转义,避免手动拼接出错。直接用 csv.Writer 配合 *os.File 即可,不需要第三方包。
常见错误是忘记调用 wr.Flush() 或 file.Close(),导致最后一行数据没写入磁盘;还有人误用 fmt.Fprintln 直接写字符串,结果字段含换行时 CSV 结构被破坏。
- 写入前确保文件以
os.O_CREATE | os.O_WRONLY | os.O_TRUNC模式打开 - 每行用
wr.Write([]string{...}),不是WriteString - 写完必须调用
wr.Flush(),否则缓冲区内容可能丢失 - 结构体转 CSV 需手动提取字段,标准库不支持 tag 自动映射(如
csv:"name")
写入含中文或特殊字符的 CSV 要注意 BOM
Windows 记事本默认用 GBK 或 UTF-8 with BOM 识别中文,纯 UTF-8(无 BOM)可能显示乱码。Go 默认写的是无 BOM 的 UTF-8,所以 Excel 打开中文字段常变问号。
解决方法是在文件开头写入 UTF-8 BOM(\uFEFF),但不能直接写进 csv.Writer——得先写 BOM 到底层 *os.File,再把 csv.Writer 绑定到该文件。
- 打开文件后立即调用
file.Write([]byte("\xEF\xBB\xBF")) - 再用
csv.NewWriter(file),后续写入保持正常 - 不要对 BOM 做任何编码转换,它是字节序列,不是字符串
- 如果目标是跨平台程序(比如导出给 Mac/Linux 用户),BOM 反而可能引发解析异常,需按使用方要求决定是否添加
csv.Write 报 write error: bad file descriptor 怎么办
这个错误通常不是权限问题,而是文件对象已被关闭,或者 Writer 绑定在已关闭的文件上。典型场景是:函数内打开文件 → 创建 Writer → defer 关闭文件 → 然后调用 Write → 最后 defer 触发关闭 → 下次 Write 就崩了。
- 确保
file.Close()在所有wr.Write()和wr.Flush()之后执行 - 不要在循环中反复创建
csv.Writer,它本身带缓冲,复用更高效 - 如果用
defer file.Close(),把它放在wr.Flush()之后,或改用显式 close - 检查是否对同一文件句柄并发写入(
比如多个 goroutine 共用一个
*csv.Writer),这会触发竞态且大概率报错
性能敏感场景下如何批量写入 CSV
单次 wr.Write() 写一行没问题,但循环写几千行时,频繁系统调用会影响速度。标准库的 csv.Writer 已内置缓冲(默认 4KB),但可以主动加大提升吞吐。
- 用
bufio.NewWriterSize(file, 64*1024)包一层,再传给csv.NewWriter - 避免在循环里做字段拼接或类型转换,提前准备好
[]string - 如果数据来自数据库查询,别用
rows.Scan()逐字段读,改用rows.Columns()+rows.Next()+rows.Values()一次性取整行[]interface{},再统一转 string - 内存充足时,可先写入
bytes.Buffer,最后一次性WriteTo到文件,减少 I/O 次数
CSV 写入真正的复杂点不在语法,而在边界场景:BOM 兼容性、大文件 flush 时机、多语言字段的编码一致性。这些地方一漏,下游用 Excel 或 Python pandas 打开就立刻暴露。
# linux
# excel
# python
# go
# windows
# golang
# 编码
# 字节
# mac
# csv
# win
# 解决方法
# pandas
# String
# Error
# 字符串
# 结构体
# 循环
# Interface
# 类型转换
# 并发
# 对象
# bom
# 数据库
# 绑定
# 写完
# 的是
# 是在
# 放在
# 多个
# 不需要
# 句柄
# 已被
# 而在
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在万网自助建站平台快速创建网站?
Laravel如何使用Blade模板引擎?(完整语法和示例)
Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧
详解Android图表 MPAndroidChart折线图
消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南
如何在搬瓦工VPS快速搭建网站?
java中使用zxing批量生成二维码立牌
Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议
b2c电商网站制作流程,b2c水平综合的电商平台?
悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音
如何快速生成高效建站系统源代码?
如何在局域网内绑定自建网站域名?
Bootstrap CSS布局之列表
如何在 React 中条件性地遍历数组并渲染元素
IOS倒计时设置UIButton标题title的抖动问题
Laravel怎么在Blade中安全地输出原始HTML内容
Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案
javascript读取文本节点方法小结
如何用狗爹虚拟主机快速搭建网站?
Laravel如何实现API速率限制?(Rate Limiting教程)
如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】
动图在线制作网站有哪些,滑动动图图集怎么做?
通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】
Laravel用户密码怎么加密_Laravel Hash门面使用教程
Laravel如何与Inertia.js和Vue/React构建现代单页应用
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】
Laravel怎么为数据库表字段添加索引以优化查询
laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法
原生JS实现图片轮播切换效果
如何在阿里云高效完成企业建站全流程?
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
如何用JavaScript实现文本编辑器_光标和选区怎么处理
iOS正则表达式验证手机号、邮箱、身份证号等
Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置
php 三元运算符实例详细介绍
JavaScript如何实现倒计时_时间函数如何精确控制
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
Laravel DB事务怎么使用_Laravel数据库事务回滚操作
Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】
如何在Windows 2008云服务器安全搭建网站?
Laravel如何处理CORS跨域请求?(配置示例)
如何快速上传自定义模板至建站之星?
Laravel如何使用.env文件管理环境变量?(最佳实践)
如何快速重置建站主机并恢复默认配置?
如何批量查询域名的建站时间记录?
如何挑选优质建站一级代理提升网站排名?


