Go 編程語言中使用文本文件指南
作為一種編程語言,Go 具有廣泛的內置功能,包括創建、讀取和寫入文本(.txt)文件等文件的功能。
文件是現代世界我們日常生活的重要組成部分。文本文件對于存儲結構化的人類可讀數據非常有用,而無需使用外部軟件或數據庫。
如果您想知道如何開始在Go中操作文本文件,那么本文是適合您的地方。
Go 中的 bufio 包
bufio 包是 Go 標準庫的一部分,用于緩沖輸入和輸出操作,因此得名。 bufio 包基于 io.Reader 和 io.Writer 接口構建,它們廣泛用于大多數 Go 標準包的實現。
bufio 包通過實現緩沖更進一步,使其對涉及文本數據的 IO 操作很有用。
要在您的程序中使用 bufio 包,您應該將它與其他包一起導入。
import (
"fmt"
"bufio"
)
當您開始使用 Go 時,您可能聽說過它包含作為程序員可能需要的一切。 為了與您的操作系統直接通信,有一個名為 os 的包,它提供了與平臺無關的功能。
os 和 bufio 包使文本文件操作變得異常簡單。
盡管 os 包的絕大多數函數都是類 Unix 的,但它們都采用 Go 風格的錯誤處理,這使得閱讀錯誤消息和調試代碼變得簡單。
那么,如何在Go中操作包含文本的文件呢?
如何從文本文件中讀取數據
要從文本文件中讀取數據,您需要調用 os 包的 Open() 函數,該函數接受要讀取的文件名作為參數。 獲取文件的另一種方法是使用 OpenFile() 函數。
Open() 和 OpenFile() 之間的主要區別在于它們的實現。 Open() 以只讀模式打開文件(使用 O_RDONLY 標志),而 OpenFile() 通過接受三個參數來提供更大的靈活性,即:
- 文件名
- 文件打開模式:有效的文件打開模式如下表所示。
標志 | 含義 |
O_RDONLY | 以只讀模式打開文件 |
O_WRONLY | 以只寫模式打開文件 |
O_RDWR | 以讀寫模式打開文件 |
O_APPEND | 寫入時將數據追加到文件 |
O_CREATE | 創建新文件(如果不存在) |
O_EXCL | 與O_CREATE一起使用,以指示僅當文件不存在時才應創建該文件 |
O_SYNC | 打開同步 I/O 的文件 |
O_TRUNC | 如果可能,在打開時截斷文件 |
- 文件權限:與 Linux 中用于指定文件訪問規則的文件權限位相同,例如,0777 向所有用戶類型授予讀取、寫入和執行權限。
下面的代碼展示了如何使用 os.Open() 和 Scan() 從 Go 中的文本文件中讀取數據, 在本例中,Scan() 在 Go for 循環中運行。
package main
import (
"bufio"
"fmt"
"log"
"os"
)
/**
CONTENT OF THE "linuxmi.txt" file.
lorem ipsum dolor sit amet
LOREM IPSUM DOLOR SIT AMET
Lorem ipsum dolor sit amet
Lorem Ipsum Dolor Sit Amet
lOREM iPSUM dOLOR sIT aMET
LoReM IpSuM DoLoR SiT AmEt
*/
func main() {
file, err := os.Open("linuxmi.txt")
// another method using os.OpenFile()
// file, err = os.OpenFile("linuxmi.txt", os.O_RDONLY, 0644)
if err != nil {
log.Fatal(err)
}
defer file.Close()
fmt.Println("File opened successfully. Now reading file contents line by line:")
// create scanner from the file to read text from
scanner := bufio.NewScanner(file)
// scan or read the bytes of text line by line
for scanner.Scan() {
fmt.Println(scanner.Text())
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
}
運行上面的代碼,它會產生如下所示的輸出:
從文件中讀取文本的程序輸出。
如果你只傳入文件名而不是 Open() 或 OpenFile() 函數的路徑以進行讀取操作,Go 會假定文件在當前目錄中,如果找不到則返回錯誤。 如果您需要處理當前目錄之外的文件,您應該傳入文件的路徑。
如何將數據寫入文本文件
bufio 包提供了一個緩沖的 Writer 接口,該接口存儲數據字節并在 Flush() 函數的幫助下將它們寫入文件。
下一個示例代碼是讀取文件的延續。 在此示例中,使用 O_WRONLY 和 O_APPEND 標志將數據寫入現有的 linuxmi.txt。
將以下代碼行添加到上面的程序中,在 main() 函數的右花括號之前:
// 將輸出數據寫入文件
file, err = os.OpenFile("linuxmi.txt", os.O_APPEND|os.O_WRONLY, 0644)
if err != nil {
log.Fatal(err)
}
defer file.Close()
fmt.Println("文件打開成功,正在準備將數據寫入文件...")
// 創建緩沖的 Writer 對象以將數據寫入文件
textWriter := bufio.NewWriter(file)
// 在保存文件之前將字符串寫入緩沖區。
_, err = textWriter.WriteString("-這是添加到文件中的新文本。")
if err != nil {
log.Fatal(err)
}
textWriter.Flush()
fmt.Println("數據寫入文件成功...")
完整程序的輸出應如下所示:
程序的輸出以讀取和寫入文本文件。
當您打開 linuxmi.txt 文件時,您還將看到文件末尾附加的新行,如下圖所示:
Go 中的文件處理非常簡單
Go 允許您處理各種文件,而不僅僅是文本文件。 有許多額外的內置庫和函數用于處理來自文件的不同類型的數據,包括 JSON 和 CSV。
要查看它們在不同情況下的行為方式有何不同,您可以嘗試可用于 OpenFile() 的各種標志和文件權限。