我无法在 Go 中找到 file.ReadLine
函数。
如何逐行读取文件?
原文由 g06lin 发布,翻译遵循 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 许可协议
7 回答5.6k 阅读
6 回答7.1k 阅读✓ 已解决
4 回答2.6k 阅读
2 回答1.1k 阅读✓ 已解决
1 回答2.3k 阅读
1 回答5.1k 阅读
2 回答1.1k 阅读
注意: 接受的答案在 Go 的早期版本中是正确的。 查看投票最高的答案 包含实现此目的的最新惯用方法。
包中有函数 ReadLine
bufio
。请注意,如果该行不适合读取缓冲区,该函数将返回一个不完整的行。如果你想通过一次函数调用总是读取程序中的整行,你需要将
ReadLine
函数封装到你自己的函数中,它调用ReadLine
在 for -环形。bufio.ReadString('\n')
不完全等同于ReadLine
因为ReadString
当新文件的最后一行不是结尾字符时,无法处理大小写。