csv - golang csv.write 不写入但没有错误

标签 csv go writer

我正在尝试打开现有的 csv 文件并写入;但是,该文件返回空。这是我的代码。

file, err := os.Open("file.csv")
    if err != nil {
        log.WithError(err)
    }

    defer file.Close()

    w := csv.NewWriter(file)
    defer w.Flush()

    var headers = []string{"h1", "h2", "h3", "h4"}
    writeHeadersErr := w.Write(headers)
    if writeHeadersErr != nil {
        log.WithError(writeHeadersErr)
        file.Close()
    }

不知道如何解决这个问题,因为我没有看到任何记录的错误。

最佳答案

os.Open以只读模式打开文件。您应该使用os.OpenFile相反:

os.OpenFile("file.csv", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)

仅供引用,请注意 os.Create 也可以工作,但正如您提到的,如果文件已经存在,它会截断文件。这可能是也可能不是您想要的。

至于为什么您没有看到错误,这是因为写入已被缓冲,并且在调用 w.Flush 之前内容并未真正写入。 w.Write中提到了这一点文档:

Writes are buffered, so Flush must eventually be called to ensure that the record is written to the underlying io.Writer.

尽管 w.Flush 本身在您的代码中被延迟,并且无论如何都不会返回错误。您可以使用 w.Error() 检查错误.

如果将这两个调用放在函数末尾,如下所示,您最终会看到错误:

    file, err := os.Open("file.csv")
    if err != nil {
        log.WithError(err)
    }
    defer file.Close()

    w := csv.NewWriter(file)
    // ... write to the file
    w.Flush()
    err = w.Error() // write file.csv: bad file descriptor

事实上,该错误意味着您使用错误的模式标志打开了文件。更多详情请参见:Golang bad file descriptor

如果您想继续推迟 w.Flush(),请将其与 w.Error() 一起放在函数文字中,如果与命名结合使用返回参数,允许您传播错误(如果有)。

例如:

func writeToCsv() (err error) {
    
    // ...open file
    w := csv.NewWriter(file)
    defer func() {
        w.Flush()
        err = w.Error()
    }()
    // ...rest of the function
}

关于csv - golang csv.write 不写入但没有错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69257525/

相关文章:

python - 在 Python 中将转义字符写入 Csv 文件

linux - 为什么 "pstack"只打印一个线程的内容?

python - Autodesk CSV 中的 csv.writer

go - 使用golang注释生成Swagger规范

go - 检查对 fmt.Errorf() 的调用是否失败

Python csv.writer 添加不需要的字符

java - 文件创建过程被损坏

javascript - CSV 文件到变量挣扎,使用 papaparse

c# - 继承类型的 CSV 序列化

python - csv reader 函数的quotechar 参数是如何工作的?