亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識(shí)庫 > golang逐行讀取文件的操作

golang逐行讀取文件的操作

熱門標(biāo)簽:上海極信防封電銷卡價(jià)格 宿遷便宜外呼系統(tǒng)代理商 仙桃400電話辦理 地圖標(biāo)注免費(fèi)定制店 寧波語音外呼系統(tǒng)公司 不封卡外呼系統(tǒng) 重慶慶云企業(yè)400電話到哪申請 鄭州智能語音電銷機(jī)器人價(jià)格 湛江crm外呼系統(tǒng)排名

我就廢話不多說了,大家還是直接看代碼吧~

func ReadLine(fileName string) ([]string,error){
	f, err := os.Open(fileName)
	if err != nil {
		return nil,err
	}
	buf := bufio.NewReader(f)
	var result []string
	for {
		line, err := buf.ReadString('\n')
		line = strings.TrimSpace(line)
		if err != nil {
			if err == io.EOF { //讀取結(jié)束,會(huì)報(bào)EOF
				return result,nil
			}
			return nil,err
		}
		result = append(result,line)
	}
	return result,nil
}

補(bǔ)充:Golang讀取文件和處理超大文件方案

Golang 操作文件的讀取的方法很多,適用的場景也是各不相同,在此我們將文件的讀取分為如下幾種 :

文件整體讀取

文件分片讀取(塊級(jí)讀取)

文件行級(jí)讀取

系統(tǒng)的配置不同,執(zhí)行的耗時(shí)也不相同,此處給出一參考

系統(tǒng)配置 :

OS : Windows10

Memory : 16G

CPU (英特爾)Intel® Core™ i3-4370 CPU @ 3.80GHz(3800 MHz)

1. 文件整體讀取

文件整體讀取就是將文件一次性讀取到,理解上是將文件的內(nèi)容第一次就讀取完了

使用場景 :

針對小文件比較合適(大文件讀取空間和時(shí)間的消耗也很大)

對于整體性強(qiáng)的文件也比較合適(文件也不能太大)

代碼示例1

package main
import (
 "bufio"
 "fmt"
 "io"
 "io/ioutil"
 "log"
 "os"
 "time"
)
// 測試用的文本文件11M大小
var m11 string = `G:\runtime\log\ccapi\11M.log`
// 測試用的文本文件400M大小
var m400 string = `G:\runtime\log\ccapi\400M.log`

// 將整個(gè)文件都讀取
func readAll(filePath string) {
 start1 := time.Now()
 ioutil.ReadFile(filePath)
 fmt.Println("readAll spend : ", time.Now().Sub(start1))
}
func main() {
 readAll(m11)
 readAll(m400)
}

$ go run main.go
readAll spend : 6.9999ms
readAll spend : 358.8014ms

代碼示例2

package main
import (
 "bufio"
 "fmt"
 "io"
 "io/ioutil"
 "log"
 "os"
 "time"
)
// 測試用的文本文件11M大小
var m11 string = `G:\runtime\log\ccapi\11M.log`
// 測試用的文本文件400M大小
var m400 string = `G:\runtime\log\ccapi\400M.log`
// 將文件完整讀取
func readAllBuff(filePath string) {
 start1 := time.Now()
 // 打開文件
 FileHandle, err := os.Open(filePath)
 if err != nil {
 log.Println(err)
 return
 }
 // 關(guān)閉文件
 defer FileHandle.Close()
 // 獲取文件當(dāng)前信息
 fileInfo, err := FileHandle.Stat()
 if err != nil {
 log.Println(err)
 return
 }
 buffer := make([]byte, fileInfo.Size())
 // 讀取文件內(nèi)容,并寫入buffer中
 n, err := FileHandle.Read(buffer)
 if err != nil {
 log.Println(err)
 }
 // 打印所有切片中的內(nèi)容
 fmt.Println(string(buffer[:n]))
 fmt.Println("readAllBuff spend : ", time.Now().Sub(start1))
}
func main() {
 readAllBuff(m11)
 readAllBuff(m400)
}

2. 文件分片讀取

對文件一部分一部分逐步的讀取,直到文件完全讀取完

PS : 每次讀取文件的大小是根據(jù)設(shè)置的 分片 大小 ,所以對于讀取文本類型的文件時(shí)(例如 : 日志文件)

不一定是按照你的期望逐行輸出,因?yàn)椴粫?huì)處理文本尾部的換行符,而是按照分片大小讀取內(nèi)容

使用場景 :

讀取超大的文件很合適

讀二進(jìn)制類型的文件很合適(比如:音視頻文件或者資源類型文件等)

代碼示例

package main
import (
 "bufio"
 "fmt"
 "io"
 "io/ioutil"
 "log"
 "os"
 "time"
)
// 測試用的文本文件11M大小
var m11 string = `G:\runtime\log\ccapi\11M.log`
// 測試用的文本文件400M大小
var m400 string = `G:\runtime\log\ccapi\400M.log`
// 文件一塊一塊的讀取
func readBlock(filePath string) {
 start1 := time.Now()
 FileHandle, err := os.Open(filePath)
 if err != nil {
 log.Println(err)
 return
 }
 defer FileHandle.Close()
 // 設(shè)置每次讀取字節(jié)數(shù)
 buffer := make([]byte, 1024)
 for {
 n, err := FileHandle.Read(buffer)
 // 控制條件,根據(jù)實(shí)際調(diào)整
 if err != nil  err != io.EOF {
 log.Println(err)
 }
 if n == 0 {
 break
 }
 // 如下代碼打印出每次讀取的文件塊(字節(jié)數(shù))
 //fmt.Println(string(buffer[:n]))
 }
 fmt.Println("readBolck spend : ", time.Now().Sub(start1))
}
func main() {
 readBlock(m11)
 readBlock(m400)
}

$ go run main.go
readBolck spend : 31.9814ms
readBolck spend : 1.0889488s

3. 文件逐行讀取

對文件一行一行的讀取,直到讀到文件末尾

使用場景 :

讀取超大的文件很合適(例如 : 超大log文件等)

讀取的文件最好是有換行的(如果使用單行文件組成的大文件,需要注意)

對需要分析內(nèi)容的大文件

統(tǒng)計(jì)某些數(shù)據(jù)出現(xiàn)的次數(shù)

查詢某些數(shù)據(jù)是否存在

查找指定行的數(shù)據(jù)

示例代碼1

package main
import (
 "bufio"
 "fmt"
 "io"
 "io/ioutil"
 "log"
 "os"
 "time"
)
// 測試用的文本文件11M大小
var m11 string = `G:\runtime\log\ccapi\11M.log`
// 測試用的文本文件400M大小
var m400 string = `G:\runtime\log\ccapi\400M.log`
// 讀取文件的每一行
func readEachLineReader(filePath string) {
 start1 := time.Now()
 FileHandle, err := os.Open(filePath)
 if err != nil {
 log.Println(err)
 return
 }
 defer FileHandle.Close()
 lineReader := bufio.NewReader(FileHandle)
 for {
  // 相同使用場景下可以采用的方法
 // func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error)
 // func (b *Reader) ReadBytes(delim byte) (line []byte, err error)
 // func (b *Reader) ReadString(delim byte) (line string, err error)
 line, _, err := lineReader.ReadLine()
 if err == io.EOF {
 break
 }
 // 如下是某些業(yè)務(wù)邏輯操作
 // 如下代碼打印每次讀取的文件行內(nèi)容
 fmt.Println(string(line))
 }
 fmt.Println("readEachLineReader spend : ", time.Now().Sub(start1))
}
func main(){
 readEachLineReader(m11)
 readEachLineReader(m400)
}

$ go run main.go
readEachLineReader spend : 16.9902ms
readEachLineReader spend : 537.9683ms

代碼示例2

package main
import (
 "bufio"
 "fmt"
 "io"
 "io/ioutil"
 "log"
 "os"
 "time"
)
// 測試用的文本文件11M大小
var m11 string = `G:\runtime\log\ccapi\11M.log`
// 測試用的文本文件400M大小
var m400 string = `G:\runtime\log\ccapi\400M.log`
// 讀取文件的每一行
func readEachLineScanner(filePath string) {
 start1 := time.Now()
 FileHandle, err := os.Open(filePath)
 if err != nil {
 log.Println(err)
 return
 }
 defer FileHandle.Close()
 lineScanner := bufio.NewScanner(FileHandle)
 for lineScanner.Scan() {
  // 相同使用場景下可以使用如下方法
 // func (s *Scanner) Bytes() []byte
 // func (s *Scanner) Text() string
 // 實(shí)際邏輯 : 對讀取的內(nèi)容進(jìn)行某些業(yè)務(wù)操作
 // 如下代碼打印每次讀取的文件行內(nèi)容
 fmt.Println(lineScanner.Text())
 }
 fmt.Println("readEachLineScanner spend : ", time.Now().Sub(start1))
}
func main() {
 readEachLineScanner(m11)
 readEachLineScanner(m400)
}

$ go run main.go
readEachLineScanner spend : 17.9895ms
readEachLineScanner spend : 574.1722ms

4. 總結(jié)

面試中常見的類似超大文件讀取的問題,通常我們采用分片讀取或者逐行讀取的方案即可

大文件的上傳也可以采用類似的解決方案 , 每次讀取文件的部分內(nèi)容上傳(寫入)網(wǎng)絡(luò)接口中,直至文件讀取完畢

普通的小文件并且對內(nèi)容沒有太多操作的,可以采用整體讀取,速度相對較快

對文件內(nèi)容有操作的采用分片讀取和逐行讀取更合適

二進(jìn)制類型文件采用分片讀取或者整體讀取的方案比較合適

文件讀取不僅是本地文件,要讀去網(wǎng)絡(luò)上的文件(各種文檔,音視頻,圖片,和其他各種類型文件)時(shí)要訪問到文件獲取 io.ReadCloser 或者 io.Reader 后可以采用三種方式將文件內(nèi)容讀取到

func ReadAll(r io.Reader) ([]byte, error) 文件完整讀取

func Copy(dst Writer, src Reader) (written int64, err error) 文件讀取并寫入

type Reader interface {
 Read(p []byte) (n int, err error)
}

通過Reader 接口的 Read 方法讀取

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • golang文件讀取-按指定BUFF大小讀取方式
  • Golang 實(shí)現(xiàn)分片讀取http超大文件流和并發(fā)控制
  • 淺談Golang是如何讀取文件內(nèi)容的(7種)
  • golang 使用 viper 讀取自定義配置文件
  • 如何利用Golang解析讀取Mysql備份文件
  • golang讀取文件的常用方法總結(jié)
  • Golang 實(shí)現(xiàn)超大文件讀取的兩種方法

標(biāo)簽:電子產(chǎn)品 物業(yè)服務(wù) 海南 遼寧 西雙版納 青海 安康 儋州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《golang逐行讀取文件的操作》,本文關(guān)鍵詞  golang,逐行,讀取,文件,的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《golang逐行讀取文件的操作》相關(guān)的同類信息!
  • 本頁收集關(guān)于golang逐行讀取文件的操作的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    99久久精品费精品国产一区二区| 国产一区二区精品| a级毛片免费全部播放| 香蕉视频久久| 九九久久国产精品| 日本伦理网站| 国产不卡在线观看| 精品国产一级毛片| 国产伦久视频免费观看视频| 国产一区二区高清视频| 国产不卡在线观看| 国产精品自拍在线| 成人免费福利片在线观看| 欧美大片a一级毛片视频| 国产网站免费观看| 欧美18性精品| 国产一区二区精品在线观看| 精品久久久久久中文字幕一区| 免费一级片网站| 麻豆网站在线看| 欧美激情一区二区三区视频 | 青青青草影院| 久久国产一区二区| 99久久精品国产免费| 精品久久久久久中文| 久久国产精品永久免费网站| 91麻豆精品国产综合久久久| 成人免费网站视频ww| 国产麻豆精品免费密入口| a级精品九九九大片免费看| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 色综合久久天天综合| 99久久精品费精品国产一区二区| 精品久久久久久中文| 日本特黄一级| 精品久久久久久免费影院| 欧美另类videosbestsex视频 | 国产成人啪精品视频免费软件| 日韩欧美一及在线播放| 欧美另类videosbestsex| 国产激情视频在线观看| 九九免费高清在线观看视频| 亚洲第一页色| 国产福利免费视频| 欧美一级视| 精品视频免费在线| 日日爽天天| 麻豆午夜视频| 国产91精品系列在线观看| 亚洲第一视频在线播放| 日本在线www| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 欧美1区| 可以在线看黄的网站| 国产网站免费观看| 免费一级生活片| 深夜做爰性大片中文| 国产麻豆精品视频| 成人免费福利片在线观看| 免费毛片播放| 色综合久久久久综合体桃花网| 色综合久久久久综合体桃花网| 国产一区免费在线观看| 一本伊大人香蕉高清在线观看| 国产高清视频免费观看| 毛片的网站| 国产a网| 亚欧成人乱码一区二区| 欧美激情一区二区三区视频 | 午夜欧美成人香蕉剧场| 你懂的在线观看视频| 国产成人精品综合| 亚洲精品影院| 欧美一级视| 99色吧| 九九热精品免费观看| 欧美一级视| 欧美日本免费| 国产视频一区二区在线播放| 日韩专区第一页| 一级女性全黄久久生活片| 午夜在线亚洲男人午在线| 99久久精品费精品国产一区二区| 久草免费在线视频| 国产91精品系列在线观看| 99久久精品费精品国产一区二区| 日韩女人做爰大片| 黄视频网站免费| 欧美a级片免费看| 日本免费乱人伦在线观看 | 亚洲精品影院| 国产伦精品一区三区视频| 高清一级片| 九九久久国产精品| 国产精品自拍亚洲| 天堂网中文在线| 日本在线www| 四虎影视久久久| 亚欧乱色一区二区三区| 黄视频网站免费| 欧美一级视| 午夜家庭影院| 深夜做爰性大片中文| 精品在线观看一区| 九九干| 黄色福利片| 日本特黄特黄aaaaa大片| 精品毛片视频| 国产视频久久久久| 99热视热频这里只有精品| 国产精品自拍在线| 毛片的网站| 欧美一区二区三区性| 国产国产人免费视频成69堂| 国产成人啪精品视频免费软件| 欧美18性精品| 日韩在线观看免费完整版视频| 成人影院一区二区三区| 国产一区二区高清视频| 韩国三级香港三级日本三级| 国产综合91天堂亚洲国产| 免费的黄色小视频| 久久国产精品永久免费网站| 久久国产精品只做精品| 精品国产一区二区三区久久久狼| 国产网站免费观看| 亚洲精品中文一区不卡| 成人免费观看的视频黄页| 国产精品自拍亚洲| 日本伦理黄色大片在线观看网站| 日韩一级黄色大片| 久久99中文字幕| 日韩免费片| 日本特黄特黄aaaaa大片| 国产成人精品综合在线| 色综合久久天天综合绕观看| 黄视频网站在线免费观看| 日韩一级黄色大片| 国产成人精品一区二区视频| 亚洲精品中文一区不卡| 日韩欧美一及在线播放| 欧美a级片免费看| 国产一区二区精品久久91| 久久成人亚洲| 999久久66久6只有精品| 成人a大片在线观看| 四虎影视久久久| 国产一区二区精品久久| 一级毛片视频免费| 久久久久久久免费视频| 香蕉视频一级| 黄视频网站在线观看| 国产视频在线免费观看| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 免费一级片网站| 美女免费毛片| 四虎久久影院| 尤物视频网站在线观看| 国产一区二区精品| 成人影视在线播放| 日本免费看视频| 色综合久久久久综合体桃花网| 久久99爰这里有精品国产| 精品视频在线看 | 你懂的在线观看视频| 欧美另类videosbestsex视频 | 精品久久久久久中文| 99久久精品国产国产毛片 | 亚洲 欧美 成人日韩| 999久久久免费精品国产牛牛| 91麻豆国产福利精品| 精品视频在线看 | 色综合久久久久综合体桃花网| 亚欧成人乱码一区二区| 国产高清视频免费观看| 成人免费观看视频| 国产视频一区二区在线播放| 国产视频一区二区三区四区| 日本伦理黄色大片在线观看网站| 九九精品影院| 成人a大片在线观看| 久久国产精品永久免费网站| 国产激情视频在线观看| 国产麻豆精品hdvideoss| 欧美大片a一级毛片视频| 国产不卡在线看| 一级女性全黄生活片免费 | 二级片在线观看| 黄视频网站在线免费观看| 久久国产精品永久免费网站| 国产一区精品| 日韩免费片| 亚洲精品中文一区不卡| 国产成人精品综合| 高清一级片| 成人影院一区二区三区| 一级女性全黄久久生活片| 午夜久久网| 欧美激情一区二区三区在线播放|