gpt4 book ai didi

file - Golang,倒带文件指针的正确方法

转载 作者:IT老高 更新时间:2023-10-28 13:09:05 25 4
gpt4 key购买 nike

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)

最佳答案

使用File.Seek(0, 0) 最容易找到文件的开头。 (或者更安全地使用常量:File.Seek(0, io.SeekStart))就像你建议的那样,但不要忘记:

The behavior of Seek on a file opened with O_APPEND is not specified.

(但这不适用于您的示例。)

将指针设置为文件的开头总是比关闭和重新打开文件快得多。如果您需要交替读取文件的不同“小”部分多次,那么也许打开文件两次以避免重复查找可能是有利可图的(担心仅当您遇到性能问题时才考虑此问题)。

再说一次,*os.File实现 io.Reader ,因此您可以将其用作 io.Reader。我不知道您在问题中提到了什么 ioutil.NewReader(data) (包 io/ioutil 没有这样的功能;也许您的意思是 bufio.NewReader() ?),但肯定不需要从文件中读取。

关于file - Golang,倒带文件指针的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42245227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com