?作為一種編程語言,Go 具有廣泛的內(nèi)置功能,包括創(chuàng)建、讀取和寫入文本(.txt)文件等文件的功能。 文件是現(xiàn)代世界我們?nèi)粘I畹闹匾M成部分。文本文件對于存儲結(jié)構(gòu)化的人類可讀數(shù)據(jù)非常有用,而無需使用外部軟件或數(shù)據(jù)庫。 如果您想知道如何開始在Go中操作文本文件,那么本文是適合您的地方。
Go 中的 bufio 包
bufio 包是 Go 標(biāo)準(zhǔn)庫的一部分,用于緩沖輸入和輸出操作,因此得名。bufio 包基于 io.Reader 和 io.Writer 接口構(gòu)建,它們廣泛用于大多數(shù) Go 標(biāo)準(zhǔn)包的實現(xiàn)。 bufio 包通過實現(xiàn)緩沖更進一步,使其對涉及文本數(shù)據(jù)的 IO 操作很有用。 要在您的程序中使用 bufio 包,您應(yīng)該將它與其他包一起導(dǎo)入。
?
?
import ( "fmt" "bufio")? 當(dāng)您開始使用 Go 時,您可能聽說過它包含作為程序員可能需要的一切。為了與您的操作系統(tǒng)直接通信,有一個名為 os 的包,它提供了與平臺無關(guān)的功能。 os 和 bufio 包使文本文件操作變得異常簡單。 盡管 os 包的絕大多數(shù)函數(shù)都是類 Unix 的,但它們都采用 Go 風(fēng)格的錯誤處理,這使得閱讀錯誤消息和調(diào)試代碼變得簡單。 那么,如何在Go中操作包含文本的文件呢?
?
如何從文本文件中讀取數(shù)據(jù)
要從文本文件中讀取數(shù)據(jù),您需要調(diào)用 os 包的 Open() 函數(shù),該函數(shù)接受要讀取的文件名作為參數(shù)。獲取文件的另一種方法是使用 OpenFile() 函數(shù)。 Open() 和 OpenFile() 之間的主要區(qū)別在于它們的實現(xiàn)。Open() 以只讀模式打開文件(使用 O_RDONLY 標(biāo)志),而 OpenFile() 通過接受三個參數(shù)來提供更大的靈活性,即:
文件名
文件打開模式:有效的文件打開模式如下表所示。
標(biāo)志 | 含義 |
O_RDONLY | 以只讀模式打開文件 |
O_WRONLY | 以只寫模式打開文件 |
O_RDWR | 以讀寫模式打開文件 |
O_APPEND | 寫入時將數(shù)據(jù)追加到文件 |
O_CREATE | 創(chuàng)建新文件(如果不存在) |
O_EXCL | 與O_CREATE一起使用,以指示僅當(dāng)文件不存在時才應(yīng)創(chuàng)建該文件 |
O_SYNC | 打開同步 I/O 的文件 |
O_TRUNC | 如果可能,在打開時截斷文件 |
文件權(quán)限:與 Linux 中用于指定文件訪問規(guī)則的文件權(quán)限位相同,例如,0777 向所有用戶類型授予讀取、寫入和執(zhí)行權(quán)限。
下面的代碼展示了如何使用 os.Open() 和 Scan() 從 Go 中的文本文件中讀取數(shù)據(jù),?在本例中,Scan() 在 Go for 循環(huán)中運行。
?
?
?
package mainimport ( "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) }}
?
運行上面的代碼,它會產(chǎn)生如下所示的輸出:
從文件中讀取文本的程序輸出
如果你只傳入文件名而不是 Open() 或 OpenFile() 函數(shù)的路徑以進行讀取操作,Go 會假定文件在當(dāng)前目錄中,如果找不到則返回錯誤。如果您需要處理當(dāng)前目錄之外的文件,您應(yīng)該傳入文件的路徑。
如何將數(shù)據(jù)寫入文本文件
bufio 包提供了一個緩沖的 Writer 接口,該接口存儲數(shù)據(jù)字節(jié)并在 Flush() 函數(shù)的幫助下將它們寫入文件。
下一個示例代碼是讀取文件的延續(xù)。在此示例中,使用 O_WRONLY 和 O_APPEND 標(biāo)志將數(shù)據(jù)寫入現(xiàn)有的 linuxmi.txt。
將以下代碼行添加到上面的程序中,在 main() 函數(shù)的右花括號之前:
?
?
?
// 將輸出數(shù)據(jù)寫入文件 file, err = os.OpenFile("linuxmi.txt", os.O_APPEND|os.O_WRONLY, 0644) if err != nil { log.Fatal(err) } defer file.Close() fmt.Println("文件打開成功,正在準(zhǔn)備將數(shù)據(jù)寫入文件...") // 創(chuàng)建緩沖的 Writer 對象以將數(shù)據(jù)寫入文件 textWriter := bufio.NewWriter(file) // 在保存文件之前將字符串寫入緩沖區(qū)。 _, err = textWriter.WriteString("-這是添加到文件中的新文本。") if err != nil { log.Fatal(err) } textWriter.Flush() fmt.Println("數(shù)據(jù)寫入文件成功...")
?
完整程序的輸出應(yīng)如下所示:
程序的輸出以讀取和寫入文本文件
當(dāng)您打開 linuxmi.txt 文件時,您還將看到文件末尾附加的新行,如下圖所示:
Go 中的文件處理非常簡單
Go 允許您處理各種文件,而不僅僅是文本文件。有許多額外的內(nèi)置庫和函數(shù)用于處理來自文件的不同類型的數(shù)據(jù),包括 JSON 和 CSV。
要查看它們在不同情況下的行為方式有何不同,您可以嘗試可用于 OpenFile() 的各種標(biāo)志和文件權(quán)限。
審核編輯:湯梓紅
評論
查看更多