Golang 逐行读取文件内容
在Golang中,有各种内部包,如bufio、os和io,可用于逐行读取文件内容。bufio和os包用于使用os.open和bufio.NewScanner函数打开和扫描文件。我们将使用io包的ioutil.ReadFile函数从给定的目标中读取文件,并使用string函数将其显示在输出中。
方法1:使用bufio和os包
在此说明中,我们使用bufio.NewScanner按行读取内容,并使用os.Open打开文件。只要还有一行可读且有扫描器,扫描方法就会返回true。text变量返回当前读取的行。函数返回时,将使用defer语句关闭文件。
语法
os.Open
这个函数是os包的一部分。它用来打开一个文件进行读取。它接受一个输入,即要打开的文件名。
bufio.NewScanner
该函数是bufio包的一部分。它用于创建一个扫描器对象,用于从文件中读取数据。
步骤
- 第1步 - 在程序中创建main包,并声明fmt(格式化包)、bufio和os包。其中main产生可执行代码,fmt用于格式化输入和输出。
-
第2步 - 创建一个main函数,并在该函数中使用os包的os.Open函数打开要读取内容的文件。
-
第3步 - 如果在打开文件时出现错误,请将错误打印在控制台上并返回。
-
第4步 - 使用defer关键字和close函数关闭打开的文件。
-
第5步 - 使用文件作为参数,在bufio.NewScanner对象中创建一个对象,并通过迭代文件的行来逐行读取内容。
-
第6步 - 迭代中使用的条件是只要文件中有一行存在就读取并打印,否则使用scanner.Scan()函数终止循环。
-
第7步 - 但是,如果在扫描过程中出现错误,请使用fmt.Println()将错误打印在控制台上。
示例
在本示例中,我们将使用扫描器逐行读取文件的内容。
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
myfile, err := os.Open("file1.txt") //open the file
if err != nil {
fmt.Println("Error opening file:", err)
return
}
defer myfile.Close()
scanner := bufio.NewScanner(myfile) //scan the contents of a file and print line by line
for scanner.Scan() {
line := scanner.Text()
fmt.Println(line)
}
if err := scanner.Err(); err != nil {
fmt.Println("Error reading from file:", err) //print error if scanning is not done properly
}
}
输出
line 1
line 2
line 3
方法2:使用io/ioutil和strings包
此示例使用ioutil.ReadFile函数将文件内容读入内存,以[]bytes格式存储。然后使用字符串转换函数和strings包将内容转换为字符串。使用Split函数将字符串根据换行符分隔成多行。接下来,通过for循环迭代每一行,并打印出来。
语法
Ioutil.ReadFile
这个函数在ioutil包中可用,用于读取文件的内容,文件名作为函数的输入。
步骤
- 步骤1 −在程序中创建一个主要的包main,并声明fmt(格式化包)、io/ioutil和strings包,其中main产生可执行代码,fmt用于格式化输入和输出。
-
步骤2 −创建一个main函数,在该函数中使用ioutil.ReadFile函数读取文件file1.txt。
-
步骤3 −如果在读取文件时出现错误,打印错误并返回。
-
步骤4 −使用strings.Split函数使用\n拆分数据。
-
步骤5 −迭代已拆分的字符串,逐行打印内容。
-
步骤6 −使用fmt.Println()函数执行打印语句,其中ln表示新行。
示例
在这个示例中,我们将使用来自io包的ioutil.ReadFile函数。
package main
import (
"fmt"
"io/ioutil"
"strings"
)
func main() {
data, err := ioutil.ReadFile("file1.txt") //read the file
if err != nil {
fmt.Println("Error reading file:", err) //print the error if comes while reading file
return
}
read_lines := strings.Split(string(data), "\n")
for _, line := range read_lines {
fmt.Println(line) //print the content line by line
}
}
输出
line 1
line 2
line 3
结论
我们使用两个示例执行了按行读取文件内容的程序。在第一个示例中使用了bufio和os包,在第二个示例中使用了io/ioutil包。