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
相关产品推荐
相关产品推荐

