我们可以使用GoLang的 "bufio"包和 "os "包来逐行读取一个文件的内容。
逐行读取一个文本文件的过程包括以下步骤:
- 使用os.open()函数来打开文件。
- 使用bufio.NewScanner()函数来创建文件扫描器。
- 使用bufio.ScanLines()函数与扫描器一起将文件分割成行。
- 然后在for循环中使用扫描器Scan()函数来获取每一行并进行处理。
下面是在GoLang中逐行读取文本文件并打印的完整代码。
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
readFile, err := os.Open("data.txt")
if err != nil {
fmt.Println(err)
}
fileScanner := bufio.NewScanner(readFile)
fileScanner.Split(bufio.ScanLines)
for fileScanner.Scan() {
fmt.Println(fileScanner.Text())
}
readFile.Close()
}
注意:data.txt文件应该和上述程序在同一个目录中,否则你会得到一个错误,打印为 "open data.txt: no such file or directory"。
逐行读取文件到字符串数组
上面的程序有两个问题:
- 文本文件的路径是硬编码的,让我们从命令行参数中读取它。
- 我们正在处理文件行,这使我们的资源保持较长的开放时间。我们可以将文件数据读入一个字符串数组,然后进行相应的处理。但对于一个非常大的文件,不建议这样做。
下面是更新后的代码,从命令行读取文件路径,并将其行数保存到一个字符串数组中。
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
filePath := os.Args[1]
readFile, err := os.Open(filePath)
if err != nil {
fmt.Println(err)
}
fileScanner := bufio.NewScanner(readFile)
fileScanner.Split(bufio.ScanLines)
var fileLines []string
for fileScanner.Scan() {
fileLines = append(fileLines, fileScanner.Text())
}
readFile.Close()
for _, line := range fileLines {
fmt.Println(line)
}
fmt.Println(fileLines)
}
我已将上述文件保存为 "read_file.go"。让我们看看如何从命令行中运行它。
% go run read_file.go data.txt
Hello World
I love Go Programming
Bye Bye
[Hello World I love Go Programming Bye Bye]
%
结论
在Go编程中读取文件是非常容易的。我们可以逐行读取文件内容并进行处理,也可以将其存储到一个字符串数组中并在以后进行处理。我们应该在工作完成后立即关闭文件资源。