ฉันมีไฟล์เล็ก ๆ มากมายฉันไม่ต้องการอ่านมันทีละบรรทัด
มีฟังก์ชั่นใน Go ที่จะอ่านไฟล์ทั้งหมดเป็นตัวแปรสตริงหรือไม่?
ฉันมีไฟล์เล็ก ๆ มากมายฉันไม่ต้องการอ่านมันทีละบรรทัด
มีฟังก์ชั่นใน Go ที่จะอ่านไฟล์ทั้งหมดเป็นตัวแปรสตริงหรือไม่?
คำตอบ:
การใช้ioutil.ReadFile
:
func ReadFile(filename string) ([]byte, error)
ReadFile อ่านไฟล์ที่ชื่อโดยชื่อไฟล์และส่งคืนเนื้อหา การโทรสำเร็จจะส่งคืน err == nil ไม่ใช่ err == EOF เนื่องจาก ReadFile อ่านไฟล์ทั้งหมดจึงไม่ถือว่า EOF จาก Read เป็นข้อผิดพลาดที่ต้องรายงาน
คุณจะได้รับแทน[]byte
string
สามารถแปลงหากจำเป็นจริงๆ :
s := string(buf)
หากคุณต้องการเนื้อหาเป็นstring
วิธีง่าย ๆ คือการใช้ReadFile
ฟังก์ชั่นจากio/ioutil
แพ็คเกจ ฟังก์ชั่นนี้จะส่งกลับชิ้นของที่คุณสามารถแปลงไปเป็นbytes
string
package main
import (
"fmt"
"io/ioutil"
)
func main() {
b, err := ioutil.ReadFile("file.txt") // just pass the file name
if err != nil {
fmt.Print(err)
}
fmt.Println(b) // print the content as 'bytes'
str := string(b) // convert content to a 'string'
fmt.Println(str) // print the content as a 'string'
}
ฉันคิดว่าสิ่งที่ดีที่สุดที่จะทำถ้าคุณกังวลเกี่ยวกับประสิทธิภาพของการต่อไฟล์ทั้งหมดเหล่านี้คือการคัดลอกไฟล์เหล่านั้นลงในบัฟเฟอร์ไบต์เดียวกัน
buf := bytes.NewBuffer(nil)
for _, filename := range filenames {
f, _ := os.Open(filename) // Error handling elided for brevity.
io.Copy(buf, f) // Error handling elided for brevity.
f.Close()
}
s := string(buf.Bytes())
วิธีนี้จะเปิดแต่ละไฟล์คัดลอกเนื้อหาลงใน buf จากนั้นปิดไฟล์ ขึ้นอยู่กับสถานการณ์ของคุณที่คุณอาจไม่ต้องการแปลงบรรทัดสุดท้ายคือเพียงเพื่อแสดงว่า buf.Bytes () มีข้อมูลที่คุณต้องการ
นี่คือวิธีที่ฉันทำ:
package main
import (
"fmt"
"os"
"bytes"
"log"
)
func main() {
filerc, err := os.Open("filename")
if err != nil{
log.Fatal(err)
}
defer filerc.Close()
buf := new(bytes.Buffer)
buf.ReadFrom(filerc)
contents := buf.String()
fmt.Print(contents)
}
ฉันไม่ได้อยู่กับคอมพิวเตอร์ดังนั้นฉันจึงเขียนร่าง คุณอาจจะชัดเจนในสิ่งที่ฉันพูด
func main(){
const dir = "/etc/"
filesInfo, e := ioutil.ReadDir(dir)
var fileNames = make([]string, 0, 10)
for i,v:=range filesInfo{
if !v.IsDir() {
fileNames = append(fileNames, v.Name())
}
}
var fileNumber = len(fileNames)
var contents = make([]string, fileNumber, 10)
wg := sync.WaitGroup{}
wg.Add(fileNumber)
for i,_:=range content {
go func(i int){
defer wg.Done()
buf,e := ioutil.Readfile(fmt.Printf("%s/%s", dir, fileName[i]))
defer file.Close()
content[i] = string(buf)
}(i)
}
wg.Wait()
}