在 Go 中逐行读取文件

新手上路,请多包涵

我无法在 Go 中找到 file.ReadLine 函数。

如何逐行读取文件?

原文由 g06lin 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 542
2 个回答

注意: 接受的答案在 Go 的早期版本中是正确的。 查看投票最高的答案 包含实现此目的的最新惯用方法。

包中有函数 ReadLine bufio

请注意,如果该行不适合读取缓冲区,该函数将返回一个不完整的行。如果你想通过一次函数调用总是读取程序中的整行,你需要将 ReadLine 函数封装到你自己的函数中,它调用 ReadLine 在 for -环形。

bufio.ReadString('\n') 不完全等同于 ReadLine 因为 ReadString 当新文件的最后一行不是结尾字符时,无法处理大小写。

原文由 user811773 发布,翻译遵循 CC BY-SA 4.0 许可协议

在 Go 1.1 和更新版本中,最简单的方法是使用 bufio.Scanner 。这是一个从文件中读取行的简单示例:

 package main

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

func main() {
    file, err := os.Open("/path/to/file.txt")
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()

    scanner := bufio.NewScanner(file)
    // optionally, resize scanner's capacity for lines over 64K, see next example
    for scanner.Scan() {
        fmt.Println(scanner.Text())
    }

    if err := scanner.Err(); err != nil {
        log.Fatal(err)
    }
}

这是逐行读取 Reader 的最干净的方法。

有一个警告:如果行长于 65536 个字符,扫描仪将出错。如果您知道您的行长度大于 64K,请使用 Buffer() 方法来增加扫描仪的容量:

 ...
scanner := bufio.NewScanner(file)

const maxCapacity int = longLineLen  // your required line length
buf := make([]byte, maxCapacity)
scanner.Buffer(buf, maxCapacity)

for scanner.Scan() {
...

原文由 Stefan Arentz 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题