如何读取文件内容并提取其中的单个单词而非单个字符?
如何读取文件内容并提取其中的单个单词而非单个字符?
看起来你现在的代码是在逐个输出文件里的单个字符,这显然和你想要提取独立单词的需求不匹配对吧?别担心,用Go的标准库就能轻松搞定这个问题,我给你两种实用的解决方案:
方法一:一次性读取文件+用strings.Fields分割单词
这种方法适合文件不大的场景,操作简单直接。我们先把整个文件内容读取出来转成字符串,再用strings.Fields按空白字符分割成单词——这个函数会自动处理连续空格、换行、制表符等各种空白,完美分割出独立的单词。
修改后的代码如下:
package main import ( "fmt" "os" "strings" ) func main() { fileContent, err := os.ReadFile("sample.txt") if err != nil { fmt.Println("读取文件时出错:", err) return // 这里一定要记得处理错误后退出,避免后续无效执行 } // 将字节内容转成字符串,再分割为单词切片 words := strings.Fields(string(fileContent)) // 遍历输出每个单词 for _, word := range words { fmt.Println(word) } }
方法二:用bufio.Scanner逐单词读取(适合大文件)
如果你的文件特别大,一次性加载到内存会占用过多资源,那可以用bufio.Scanner来逐单词扫描文件,这样内存占用会低很多。我们只需要把扫描器的分割规则设置为bufio.ScanWords,它就会自动按单词来读取内容。
代码示例:
package main import ( "bufio" "fmt" "os" ) func main() { file, err := os.Open("sample.txt") if err != nil { fmt.Println("打开文件时出错:", err) return } defer file.Close() // 记得用defer确保文件被关闭 scanner := bufio.NewScanner(file) // 设置扫描器按单词分割内容 scanner.Split(bufio.ScanWords) // 循环扫描每个单词 for scanner.Scan() { fmt.Println(scanner.Text()) } // 检查扫描过程中是否出现错误 if err := scanner.Err(); err != nil { fmt.Println("扫描文件时出错:", err) } }
额外说明
如果你的“单词”定义比较特殊(比如包含连字符、撇号,或者需要排除附着在单词上的标点符号),那可能需要用regexp包来编写自定义的分割规则,但如果只是普通的空白分隔单词,上面两种方法完全够用啦。
备注:内容来源于stack exchange,提问作者Ashom Azi




