如何在 Golang 中逐词读取文件?


在 Go 中处理文件时,经常需要逐词读取文件。在本文中,我们将探讨如何在 Golang 中逐词读取文件。我们将讨论完成此任务的三种不同方法,并提供代码片段来演示每种方法。

方法 1:使用 bufio.NewScanner

第一种方法是使用 bufio 包及其 NewScanner 函数逐词读取文件。此函数将 io.Reader 接口作为输入,并返回一个 Scanner 对象,该对象可用于逐词扫描文件。

示例

这是一个演示此方法的示例代码片段:

package main

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

func main() {
   file, err := os.Open("filename.txt")
   if err != nil {
      panic(err)
   }
   defer file.Close()
   
   scanner := bufio.NewScanner(file)
   
   // Set the split function for the scanning operation.
   scanner.Split(bufio.ScanWords)
   
   // Scan all words from the file.
   for scanner.Scan() {
      fmt.Println(scanner.Text())
   }
   
   if err := scanner.Err(); err != nil {
      panic(err)
   }
}

在此示例中,我们首先使用 os 包打开文件并检查错误。然后,我们使用 bufio 包创建一个新的扫描器,并将 split 函数设置为 bufio.ScanWords 以逐词读取文件。最后,我们遍历每个单词并将其打印到控制台。

方法 2:使用 fmt.Fscanf

第二种方法是使用 fmt 包及其 Fscanf 函数逐词读取文件。此函数将 io.Reader 接口作为输入,并返回成功扫描的项目数。

示例

这是一个演示此方法的示例代码片段:

package main

import (
   "fmt"
   "os"
)

func main() {
   file, err := os.Open("filename.txt")
   if err != nil {
      panic(err)
   }
   defer file.Close()
   
   var word string
   
   for {
      _, err := fmt.Fscanf(file, "%s", &word)
      if err != nil {
         break
      }
      fmt.Println(word)
   }
}

在此示例中,我们首先使用 os 包打开文件并检查错误。然后,我们创建一个名为 word 的变量,并使用 fmt.Fscanf 函数循环遍历文件,直到文件结束。该函数扫描文件以查找下一个单词并将其存储在 word 变量中,然后我们将其打印到控制台。

方法 3:使用 bufio.NewReader 和 strings.Fields

第三种方法是使用 bufio 包及其 NewReader 函数以及 strings 包及其 Fields 函数逐词读取文件。NewReader 函数创建一个新的缓冲读取器,而 Fields 函数将字符串拆分为单词。

示例

这是一个演示此方法的示例代码片段:

package main

import (
   "bufio"
   "fmt"
   "os"
   "strings"
)

func main() {
   file, err := os.Open("filename.txt")
   if err != nil {
      panic(err)
   }
   defer file.Close()
   
   reader := bufio.NewReader(file)
   
   for {
      line, err := reader.ReadString('\n')
      if err != nil {
         break
      }
      words := strings.Fields(line)
      for _, word := range words {
         fmt.Println(word)
      }
   }
}

在此示例中,我们首先使用 os 包打开文件并检查错误。然后,我们使用 bufio 包创建一个新的读取器,并使用 reader.ReadString 函数循环遍历文件中的每一行。该函数读取文件中的每一行,直到遇到换行符(\n),并将该行作为字符串返回。

但是,如果我们想逐词读取文件,则需要将每一行拆分为单词。为此,我们可以使用 Go 中的 strings 包。

示例

让我们看看如何在 Go 中逐词读取文件的示例:

package main

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

func main() {
   file, err := os.Open("test.txt")
   if err != nil {
      panic(err)
   }
   defer file.Close()
   
   scanner := bufio.NewScanner(file)
   scanner.Split(bufio.ScanWords)
   
   for scanner.Scan() {
      word := scanner.Text()
      fmt.Println(word)
   }
   
   if err := scanner.Err(); err != nil {
      panic(err)
   }
}

在上面的示例中,我们首先使用 os 包打开文件并检查错误。然后,我们使用 bufio 包创建一个新的扫描器,并将其 split 函数设置为 bufio.ScanWords。这告诉扫描器将输入拆分为单词。

接下来,我们使用 scanner.Scan() 函数循环遍历文件中的每个单词,该函数读取输入中的下一个单词,如果成功则返回 true。然后,我们使用 scanner.Text() 函数获取单词并将其打印到控制台。

最后,我们使用 scanner.Err() 函数检查是否有任何错误。

结论

使用 bufio 包和 strings 包,在 Go 中逐词读取文件非常容易。通过使用 bufio.ScanWords 函数,我们可以将输入拆分为单词并循环遍历文件中的每个单词。

更新于: 2023年4月25日

575 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告