猿问

使用范围循环迭代时将条目写入 CSV 文件时出现问题

在此代码中,我试图读取目录中的书名,然后将它们写入 CSV 文件,但它只将第一本书名写入 CSV 文件。我不知道如何让它进一步工作。


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)

    }


    for _, file := range files {

        // fmt.Println(file.Name())

        fileData := []string{

            file.Name(),

        }

        csvWriter := csv.NewWriter(csvFile)


        csvWriter.Write(fileData)


        csvWriter.Flush()

        csvFile.Close()

    }

}


守候你守候我
浏览 104回答 1
1回答

手掌心

问题是你在循环内关闭文件,所以在第一次迭代之后它已经关闭了。此外,无需csvWriter在循环内创建,您可以创建一个并在循环后刷新它。请注意,您可以在创建文件句柄和编写器后立即使用defer 语句设置清理代码(这样,您不必担心在控制流可能从函数返回的任何地方显式包含清理代码). 在离开函数之前,defer 语句将以相反的顺序执行,因此在下面的示例中csvWriter.Flush()将按预期执行 before csvFile.Close():// ...csvFile, err := os.Create("English.csv")if err != nil {    log.Fatal(err)}defer csvFile.Close()csvWriter := csv.NewWriter(csvFile)defer csvWriter.Flush()for _, file := range files {    fileData := []string{ file.Name() }    csvWriter.Write(fileData)}// ...
随时随地看视频慕课网APP

相关分类

Go
我要回答