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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在这里使用两个读取器来读取csv文件.要回放我使用的文件 data.Seek(0, 0)是一个好方法吗?或者最好关闭文件并在第二次阅读前再次打开.
是不是也是正确的使用*File作为io.Reader?或者最好这样做r := ioutil.NewReader(data)
icz*_*cza 14
使用File.Seek(0, 0)正如您的建议,最简单地查找文件的开头,但不要忘记:
未指定使用O_APPEND打开的文件的Seek行为.
(但这不适用于您的示例.)
将指针设置为文件的开头总是比关闭和重新打开文件快得多.如果你需要阅读的文件不同,"小"的部分很多次,交替进行,那么也许它可能是有利可图开两次重复避免求(约合这种担心只有当你有peformance问题)的文件.
再次,File.Seek(0, io.SeekStart)实现*os.File,所以你可以使用它作为io.Reader.我不知道io.Reader你在问题中提到了什么(包ioutil.NewReader(data)没有这样的功能;也许你的意思io/ioutil?),但当然不需要从文件中读取.
| 归档时间: |
|
| 查看次数: |
6783 次 |
| 最近记录: |