Golang程序 逐行读取文件的内容
在golang中,有各种内部包,如bufio、os和io,可以用来逐行读取文件的内容。bufio和os包用于使用os.open和bufio.NewScanner函数来打开和扫描文件。io包我们将使用ioutil.ReadFile从给定的目的地读取文件,并使用字符串函数将其显示在输出中。
方法1:使用bufio和os包
在这个插图中,bufio.NewScanner被用来逐行读取内容,os.Open被用来打开文件。只要有一行要读,有一个扫描器,扫描方法就会返回真。当前读取的行由文本返回。当该函数返回时,文件将使用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()在控制台打印错误。
例子
在这个例子中,我们将使用scanner逐行读取一个文件的内容。
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和字符串包
该实例使用ioutil.ReadFile函数将文件的内容以[]字节的形式读入内存。然后使用字符串函数和字符串将内容变成一个字符串。使用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包。