package main
import (
"bufio"
"encoding/csv"
"fmt"
"io"
"log"
"os"
)
func main() {
data, err := os.Open("cc.csv")
defer data.Close()
if err != nil {
log.Fatal(err)
}
s := bufio.NewScanner(data)
for s.Scan() {
fmt.Println(s.Text())
if err := s.Err(); err != nil {
panic(err)
}
}
// Is it a proper way?
data.Seek(0, 0)
r := csv.NewReader(data)
for {
if record, err := r.Read(); err == io.EOF {
break
} else if err != nil {
log.Fatal(err)
} else {
fmt.Println(record)
}
}
}
我在这里使用两个读取器来读取csv文件。
要回放文件我使用data.Seek(0, 0)
这是一个好方法吗?或者最好关闭文件并在第二次阅读之前再次打开。
将*File
用作io.Reader
是否正确?或者最好做r := ioutil.NewReader(data)
答案 0 :(得分:13)
使用File.Seek(0, 0)
(或者更安全地使用常量:File.Seek(0, io.SeekStart)
)来查找文件的开头最简单,就像你建议的那样,但不要忘记:
未指定使用O_APPEND打开的文件的搜索行为。
(但这不适用于你的例子。)
将指针设置为文件的开头总是比关闭和重新打开文件快得多。如果您需要阅读文件的“小”部分许多次,交替,那么可能打开文件两次以避免重复搜索(担心)可能是有利可图的只有当你遇到性能问题时才会这样做。)
同样,*os.File
会实现io.Reader
,因此您可以将其用作io.Reader
。我不知道你在问题中提到的是什么ioutil.NewReader(data)
(包io/ioutil
没有这样的功能;也许你的意思是bufio.NewReader()
?),但当然不需要从文件。