go按行讀寫檔案
阿新 • • 發佈:2019-01-12
2019年第一篇部落格
兜兜轉轉又回來更新go的部落格了,今天來講一下如何使用golang進行檔案的讀寫
檔案讀寫需要使用的包
- os
- ioutil
- bufio
- strings
檔案讀寫總是少不了判斷檔案是否存在!
go裡面使用os.Stat 和 os.IsNotExist 相結合來判斷檔案是否存在
os.Stat 是用來獲取檔案的相關資訊的,比如檔案大小,最近一次修改時間等,但是假如檔案不存在就返回error
我們就需要這個error 然後IsNotExist 判斷 有 error說明檔案不存在
show me your code?
// 判斷檔案是否存在
if _, err := os.Stat(filename); os.IsNotExist(err) {
return err
}
按行讀檔案
這裡我使用了ioutil.ReadFile() 需要注意的是這個返回的是[]byte 型別的,需要轉為string 才是我們可讀的樣子
按行讀取有兩種方式 1 讀取整個檔案然後按照\n 分割,再迴圈讀取 2 使用ioutil.ReadLine
func Readlines(filename string) { // go 按行讀取檔案的方式有兩種, // 第一 將讀取到的整個檔案內容按照 \n 分割 // 使用bufio // 第一種 lines, err := ioutil.ReadFile(filename) if err != nil { fmt.Println(err) } else { contents := string(lines) lines := strings.Split(contents, "\n") for _, line := range lines { fmt.Println(line) } } // 第二種 fd, err := os.Open(filename) defer fd.Close() if err != nil { fmt.Println("read error:", err) } buff := bufio.NewReader(fd) for { data, _, eof := buff.ReadLine() if eof == io.EOF { break } fmt.Println(string(data)) } }
寫檔案
我這裡的寫檔案是寫入一個已經存在的檔案,需要特別注意的是使用os.Open方式是隻讀的方式開啟的,這樣無法寫入也沒有報錯
所以應該使用os.OpenFile 指定開啟的方式為 os.O_RDWR|os.O_APPEND 這樣才能使用寫入,並且會追加寫入
,只使用os.O_RDWR,每次都是覆蓋寫入,os.O_APPEND 無法寫入
func WriterTXT(filename, content string) error { // 寫入檔案 // 判斷檔案是否存在 if _, err := os.Stat(filename); os.IsNotExist(err) { return err } fd, err := os.OpenFile(filename, os.O_RDWR|os.O_APPEND, 0666) defer fd.Close() if err != nil { return err } w := bufio.NewWriter(fd) _, err2 := w.WriteString(content) if err2 != nil { return err2 } w.Flush() fd.Sync() return nil }