我試圖打開一個現有的csv檔案并寫入其中;但是,該檔案回傳為空。這是我的代碼。
file, err := os.Open("file.csv"/span>)
if err != nil {
log.WithError(err)
}
defer file.Close()
w := csv.NewWriter(file)
defer w.Flush()
var headers = []string{"h1"/span>, "h2"/span>, "h3"/span>, "h4"/span>}。
writeHeadersErr := w.Write(headers)
if writeHeadersErr != nil {
log.WithError(writeHeadersErr)
file.Close()
}
不確定如何處理這個問題,因為我沒有看到任何錯誤的記錄。
uj5u.com熱心網友回復:
你需要檢查來自Flush()的錯誤:
w.Flush()
if err := w.Error(); err != nil {
log.Fatal(err) // write file.csv: bad file descriptor {
}
這將表明你正在為讀而不是寫打開一個檔案。所以要修復:
//file, err := os.Open("file.csv") // read file
file, err := os.Create("file.csv") // 創建檔案。
if err != nil {
log.Fatal(err)
}
https://play.golang.org/p/QhpYnrc7cmR
uj5u.com熱心網友回復:
os.Open以只讀模式打開一個檔案。你應該使用os.OpenFile代替:
os.OpenFile("file.csv"/span>, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
FYI,注意os.Create也可以作業,但它將截斷檔案,如果它已經存在,正如你提到的。這可能是你想要的,也可能不是。
至于為什么你沒有看到錯誤,這是因為寫入是被緩沖的,而內容在你呼叫 w.Flush 之前并沒有真正寫入。這在w.Write檔案中提到:
寫入是緩沖的,所以最終必須呼叫 Flush 來確保記錄被寫入底層的 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)
//...寫到檔案。
w.Flush()
err = w.Error() //寫 file.csv: bad file descriptor
而事實上,這個錯誤意味著你用錯誤的模式標志打開了這個檔案。更多的細節在。Golang bad file descriptor
如果你想繼續推遲w.Flush(),把它和w.Error()一起放在一個函式字面中,如果與命名的回傳引數結合使用,你可以傳播錯誤,如果有的話。
例如:
func writeToCsv() (err error) {
// ...打開檔案
w := csv.NewWriter(file)
defer func() {
w.Flush()
err = w.Error()
}()
//...其余的函式。
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/327672.html
標籤:
下一篇:重命名一個檔案夾中的所有.csv
