1. 程式人生 > >go按行讀寫檔案

go按行讀寫檔案

2019年第一篇部落格

兜兜轉轉又回來更新go的部落格了,今天來講一下如何使用golang進行檔案的讀寫

檔案讀寫需要使用的包

  1. os
  2. ioutil
  3. bufio
  4. 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
}

不要忘了close檔案

在這裡插入圖片描述