我正在尝试打开现有的 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/