Golang 如何逐字读取文件

Golang 如何逐字读取文件

文件读取是编程语言中非常重要的一个方面。我们需要以编程方式执行某些操作,使用文件读写自动化使我们能够创建某些看起来可能不可能的程序/项目。

文件输入

要使用文件,我们必须输入现有文件,因为我们正在从文件中读取. 我们当然可以使用文件名进行输入,但在这里,我们简单地采用预定义文件进行读取。我们可以通过在Golang中使用os包/模块打开文件进行读取。 os包中的Open函数允许我们将文件名作为参数传递给它。

// Golang程序打开文件
package main
import (
    "os"
    "log"
)
func main() {
    file, err := os.Open("sample.txt")
    if err != nil {
        log.Fatal(err)
    }
} 
Go

Open函数返回文件的指针引用或返回错误(如果文件未找到,无法为读取而打开等)。所以,我们存储任何一个值取决于哪个适用。如果我们有一个错误,我们只想使用Go中的日志包记录错误并通过日志包退出程序。

输出:

&{0x11934420}
Go

使用bufio扫描文件

要从文件指针中实际获取内容,我们需要使用具有按行、按单词、按字符(rune)等方式读取文件内容的Scanner函数。

在此之前,我们需要一个Reader来从流中读取,我们使用NewScanner函数,该函数将流作为参数。由于我们要从文件中读取,所以我们将文件指针解析为参数。这将创建一个Scanner,可以从提供的文件中读取。

初始化Scanner之后,我们可以提供一个拆分器(Split函数)或按特定格式读取的一种格式。由于我们要逐字读取,所以我们将解析bufio.ScanWords函数。该函数作为所给流的拆分器,即将整个文件分割为我们提供的拆分函数,即单词。

// Golang程序扫描文件
package main
 
import (
    "fmt"
    "os"
    "log"
    "bufio"
)
 
func main() {
    file, err := os.Open("sample.txt")
    if err != nil {
        log.Fatal(err)
    }else{
        fmt.Println(file)
    }
    Scanner := bufio.NewScanner(file)
    Scanner.Split(bufio.ScanWords)
    fmt.Println(Scanner)
} 
Go

输出:

&{0x11864420}
&{0x118061a8 0x48e410 65536 [] [] 0 0 <nil> 0 false false}
Go

因此,使用bufio Scanner及其相关函数(如NewScanner、Split和ScanWords),我们能够设置文件扫描器。我们现在可以从扫描器中读取文件中的每个单词。

扫描单词

为了迭代文件,我们创建了扫描器,并将有关文件的所有信息存储在Scanner中。我们可以使用另一个名为Scan的函数来访问文件的内容。此函数使Scanner前进到下一个拆分令牌。因此,如果扫描器中存在内容/令牌,则返回true,否则返回false,如果我们到达文件结尾,则为EOF,错误消息将为nil,并因此退出而没有有效的错误。在循环内,我们可以使用Text函数。此函数返回最近分配给Scanner的字节,对于我们的情况,它是我们提供的文件。因此,它基本上获取Scan函数正在迭代的当前令牌的文本。因此,我们可以打印Text函数返回的值。

// Go程序,用于扫描单词
package main

import (
    "fmt"
    "os"
    "bufio"
    "log"
)

func main() {
    file, err := os.Open("sample.txt")
    if err != nil {
        log.Fatal(err)
    }

    Scanner := bufio.NewScanner(file)
    Scanner.Split(bufio.ScanWords)

    for Scanner.Scan() {
        fmt.Println(Scanner.Text())
    }
    if err := Scanner.Err(); err != nil {
        log.Fatal(err)
    }
} 
Go

Golang 如何逐字读取文件

如我们所见,我们能够逐个单词地遍历文件。使用 err 变量进行错误检查,我们首先将错误存储在 err 变量中,然后 仅当 err 不为 nil 时,才被视为错误,并在记录错误后退出程序。 在我们评估条件之前, 分号(;) 用于在 go 语言中链接语句。

向字符串切片添加元素

我们只是逐个打印文件内容,这可能不是该软件包的好用例。在这种情况下,我们甚至可以将上下文以字符串切片的形式存储,其中每个元素都是一个单词。

// Go程序,用于向字符串切片添加元素
package main

import (
    "fmt"
    "os"
    "bufio"
    "log"
)

func main() {
    file, err := os.Open("sample.txt")

    var words []string

    if err != nil {
        log.Fatal(err)
    }

    Scanner := bufio.NewScanner(file)
    Scanner.Split(bufio.ScanWords)

    for Scanner.Scan() {
        words = append(words, Scanner.Text())
    }

    fmt.Println(words)
    for _, word := range words {
        fmt.Println(word)
    }
    if err := Scanner.Err(); err != nil {
        log.Fatal(err)
    }
} 
Go

这段代码中改变的只是我们追加和迭代创建的字符串切片的方式。我们首先通过句法 name []string 初始化字符串切片,在初始化 Scanner 并使用 Scan 函数进行迭代后,我们简单地将来自 Scanner.Text() 函数返回的值附加到字符串切片中。我们可以打印出这个切片,或者迭代它并对其进行所需的处理。这就是我们如何在 Golang 中将文件内容逐个单词附加到字符串切片中的方法。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册