You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言range循环迭代写入CSV文件仅成功写入首条数据问题

问题根因

代码只写入第一条数据是两个逻辑错误导致的:

  • 你把CSV文件关闭操作csvFile.Close()写在了遍历文件的for循环内部,第一次循环执行完就直接关闭了目标CSV文件,后续循环拿到的是已关闭的文件句柄,写入操作全部失效
  • 每次循环都重新初始化csvWriter写入器,反复重建写入流会破坏文件写入状态,属于完全不必要的操作
修复方案

把写入器初始化、文件关闭、缓冲区刷新的逻辑全部移到循环外部,资源初始化完成后再遍历写入所有文件名,推荐用defer保证资源一定会被释放,修复后完整代码如下:

package main

import (
	"encoding/csv"
	"io/ioutil"
	"log"
	"os"
)

func main() {
	files, err := ioutil.ReadDir("/home/bilal/Documents/Books/English")
	if err != nil {
		log.Fatal(err)
	}

	csvFile, err := os.Create("English.csv")
	if err != nil {
		log.Fatal(err)
	}
	// 函数退出前自动关闭文件,避免漏释放
	defer csvFile.Close()

	// 仅初始化一次CSV写入器
	csvWriter := csv.NewWriter(csvFile)
	// 所有内容写完后统一刷新缓冲区落盘
	defer csvWriter.Flush()

	for _, file := range files {
		row := []string{file.Name()}
		if writeErr := csvWriter.Write(row); writeErr != nil {
			log.Fatalf("写入文件名%s失败: %v", file.Name(), writeErr)
		}
	}
}
注意点
  • 所有IO操作建议都检查返回的error,原代码没检查csvWriter.Write的返回值,所以后续写入失败完全没提示,这也是你没定位到问题的原因之一
  • 不需要每写一行就执行一次Flush(),所有内容写完统一刷新一次缓冲区即可,性能更好

内容的提问来源于stack exchange,提问作者Veins Tree

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 21:09:25