本文翻译自:reading file line by line in go
I'm unable to find file.ReadLine
function in Go. 我在Go中找不到file.ReadLine
函数。 I can figure out how to quickly write one, but just wondering if I'm overlooking something here. 我可以弄清楚如何快速编写一个,但是想知道我是否在这里忽略了一些东西。 How does one read a file line by line? 如何逐行读取文件?
#1楼
参考:https://stackoom.com/question/AKcd/逐行读取文件
#2楼
EDIT: As of go1.1, the idiomatic solution is to use bufio.Scanner 编辑:从go1.1开始,惯用的解决方案是使用bufio.Scanner
I wrote up a way to easily read each line from a file. 我写了一种轻松读取文件中每一行的方法。 The Readln(*bufio.Reader) function returns a line (sans \\n) from the underlying bufio.Reader struct. Readln(* bufio.Reader)函数从基础bufio.Reader结构返回一行(sans \\ n)。
// Readln returns a single line (without the ending \n)
// from the input buffered reader.
// An error is returned iff there is an error with the
// buffered reader.
func Readln(r *bufio.Reader) (string, error) {
var (isPrefix bool = true
err error = nil
line, ln []byte
)
for isPrefix && err == nil {
line, isPrefix, err = r.ReadLine()
ln = append(ln, line...)
}
return string(ln),err
}
You can use Readln to read every line from a file. 您可以使用Readln读取文件中的每一行。 The following code reads every line in a file and outputs each line to stdout. 以下代码读取文件中的每一行,并将每一行输出到stdout。
f, err := os.Open(fi)
if err != nil {
fmt.Printf("error opening file: %v\n",err)
os.Exit(1)
}
r := bufio.NewReader(f)
s, e := Readln(r)
for e == nil {
fmt.Println(s)
s,e = Readln(r)
}
Cheers! 干杯!
#3楼
bufio.Reader.ReadLine() works well. bufio.Reader.ReadLine()运作良好。 But if you want to read each line by a string, try to use ReadString('\\n') . 但是,如果要按字符串读取每一行,请尝试使用ReadString('\\ n') 。 It doesn't need to reinvent the wheel. 不需要重新发明轮子。
#4楼
You can also use ReadString with \\n as a separator: 您还可以使用带有\\ n的ReadString作为分隔符:
f, err := os.Open(filename)
if err != nil {
fmt.Println("error opening file ", err)
os.Exit(1)
}
defer f.Close()
r := bufio.NewReader(f)
for {
path, err := r.ReadString(10) // 0x0A separator = newline
if err == io.EOF {
// do something here
break
} else if err != nil {
return err // if you return error
}
}
#5楼
// strip '\n' or read until EOF, return error if read error
func readline(reader io.Reader) (line []byte, err error) {
line = make([]byte, 0, 100)
for {
b := make([]byte, 1)
n, er := reader.Read(b)
if n > 0 {
c := b[0]
if c == '\n' { // end of line
break
}
line = append(line, c)
}
if er != nil {
err = er
return
}
}
return
}
#6楼
In Go 1.1 and newer the most simple way to do this is with a bufio.Scanner
. 在Go 1.1和更高版本中,最简单的方法是使用bufio.Scanner
。 Here is a simple example that reads lines from a file: 这是一个从文件读取行的简单示例:
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)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
}
This is the cleanest way to read from a Reader
line by line. 这是逐行从Reader
读取的最干净的方法。
There is one caveat: Scanner does not deal well with lines longer than 65536 characters. 请注意以下几点:扫描程序不能处理超过65536个字符的行。 If that is an issue for you then then you should probably roll your own on top of Reader.Read()
. 如果这对您来说是个问题,那么您可能应该将自己的代码放在Reader.Read()
之上。