国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Golang 按行讀取文件的三種方法

這篇具有很好參考價值的文章主要介紹了Golang 按行讀取文件的三種方法。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Golang 是一種現(xiàn)代的編程語言,它具有高效、簡潔和可擴展等特點,因此在各種領(lǐng)域廣泛應(yīng)用。在 Golang 中,讀取文件是一個常見的操作。在本篇技術(shù)博客中,我將介紹如何在 Golang 中按行讀取文件。

1.bufio.Scanner

Golang 中有一個 bufio 包,它提供了 Scanner 類型,可以方便地按行讀取文件。我們可以使用 Scanner 的 Scan() 方法來讀取每一行。

bufio.Scanner是一個基于緩沖區(qū)的數(shù)據(jù)掃描器,它提供了方便的逐行/逐詞讀取操作。Scan 方法是bufio.Scanner 的一個核心方法,用于掃描緩沖區(qū)中的數(shù)據(jù)并返回掃描到的下一個 Token。

Scan 方法的簽名如下:

func (s *Scanner) Scan() bool

該方法返回一個 bool 類型值,表示掃描是否成功。如果掃描成功,該方法會將下一個Token讀取出來并保存在Scanner的Text字段中。如果掃描失敗,則返回false。

在讀取Token之前,Scanner會將緩沖區(qū)中的數(shù)據(jù)讀取到底層的Reader中,并從底層的Reader中獲取新的數(shù)據(jù)填充到緩沖區(qū)中。因此,在Scan方法調(diào)用之前,Scanner的緩沖區(qū)中可能已經(jīng)包含了一部分數(shù)據(jù),也可能為空。

掃描過程中,Scanner會將緩沖區(qū)中的數(shù)據(jù)按照分隔符進行分割,并將分割后的Token返回。默認情況下,Scanner使用換行符作為分隔符,即每次掃描一行數(shù)據(jù)。如果需要使用其他分隔符,可以使用Scanner的Split方法進行設(shè)置。

// ReadLines reads all lines of the file.
func ReadLines(path string) ([]string, error) {
	file, err := os.Open(path)
	if err != nil {
		return nil, err
	}
	defer file.Close()

	var lines []string
	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		lines = append(lines, scanner.Text())
	}
	return lines, scanner.Err()
}

上面的代碼中,我們首先使用 NewScanner() 函數(shù)創(chuàng)建一個 Scanner 對象。然后在 for 循環(huán)中,我們使用 Scanner 的 Scan() 方法讀取文件的每一行,然后使用 Text() 方法獲取每一行的內(nèi)容。最后,我們將獲取到的行追加到字符串切片中。

2.bufio.Reader

除了使用 Scanner 類型之外,我們還可以使用 bufio 包中的 Reader 類型按行讀取文件。在使用 bufio.Reader 時,我們需要使用 ReadBytes() 或 ReadString() 方法來讀取每一行,示例代碼如下:

// ReadLinesV2 reads all lines of the file.
func ReadLinesV2(path string) ([]string, error) {
	file, err := os.Open(path)
	if err != nil {
		return nil, err
	}
	defer file.Close()

	var lines []string
	reader := bufio.NewReader(file)
	for {
		// ReadString reads until the first occurrence of delim in the input,
		// returning a string containing the data up to and including the delimiter.
		line, err := reader.ReadString('\n')
		if err == io.EOF {
			lines = append(lines, line)
			break
		}
		if err != nil {
			return lines, err
		}
		lines = append(lines, line[:len(line)-1])
	}
	return lines, nil
}

上面的代碼中,我們使用 NewReader() 函數(shù)創(chuàng)建一個 Reader 對象。在 for 循環(huán)中,我們使用 ReadString() 函數(shù)讀取每一行的內(nèi)容,并將其追加到字符串切片中。

需要注意的是,在使用 ReadString() 函數(shù)時,我們需要指定分隔符,例如 ‘\n’ 表示以換行符為分隔符。如果讀取的文件中沒有指定的分隔符,ReadString() 函數(shù)會返回一個錯誤,因此我們需要在 for 循環(huán)中檢查是否發(fā)生了錯誤。

3.bufio.Reader 的 ReadLine

使用 bufio.Reader 逐行讀取文件時,除了使用 ReadBytes() 或 ReadString() 方法,還可以使用 ReadLine() 函數(shù)。

// ReadLinesV3 reads all lines of the file.
func ReadLinesV3(path string) ([]string, error) {
	f, err := os.Open(path)
	if err != nil {
		return nil, err
	}
	defer f.Close()

	var lines []string
	r := bufio.NewReader(f)
	for {
		// ReadLine is a low-level line-reading primitive.
		// Most callers should use ReadBytes('\n') or ReadString('\n') instead or use a Scanner.
		bytes, _, err := r.ReadLine()
		if err == io.EOF {
			break
		}
		if err != nil {
			return lines, err
		}
		lines = append(lines, string(bytes))
	}
	return lines, nil
}

使用 bufio.Reader 的 ReadLine() 方法可以讀取一行數(shù)據(jù),但是需要注意它的返回值。ReadLine() 函數(shù)的返回值包括三個部分:讀取到的數(shù)據(jù)、是否讀取完整一行以及錯誤信息。如果讀取到的數(shù)據(jù)超出了緩存區(qū)的大小,它會返回一個錯誤信息,而不是完整的一行數(shù)據(jù)。

因此,如果讀取的一行數(shù)據(jù)的長度超過了緩存區(qū)的大小,ReadLine() 函數(shù)將無法讀取到完整的一行數(shù)據(jù)。為了避免這種情況的發(fā)生,我們可以通過設(shè)置緩存區(qū)的大小來解決。

ReadLine 是一個低級的行讀取原語。大多數(shù)調(diào)用者應(yīng)該使用 ReadBytes(‘\n’) 或 ReadString(‘\n’),或者使用 Scanner。

4.dablelv/cyan

本文實現(xiàn)的函數(shù)已放置開源倉庫 dablelv/cyan,歡迎大家使用。

package main

import (
	"github.com/dablelv/go-huge-util/file"
)

func main() {
	path := "your/file/path"
	lines, err := file.ReadLines(path)
	lines, err = file.ReadLinesV2(path)
	lines, err = file.ReadLinesV3(path)
}

推薦使用 file.ReadLines。

dablelv/cyan 除了類型轉(zhuǎn)換,還有很多其他實用函數(shù),如加解密、zip 解壓縮等,歡迎大家使用、Star、Issue 和 Pull Request。


參考文獻

dablelv/cyan - GitHub文章來源地址http://www.zghlxwxcb.cn/news/detail-473761.html

到了這里,關(guān)于Golang 按行讀取文件的三種方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • python讀取和保存圖片的三種方法

    python讀取和保存圖片的三種方法

    可以看到opencv讀取的圖片數(shù)據(jù)類型是uint8格式(屬于numpy),uint8是專門用于存儲各種圖像的(包括RGB,灰度圖像等),范圍是從0–255。 讀取的形狀為(H,W,C),BGR 還有一個保存方式叫plt.savefig(),但是使用這種方式保存的時候,保存的圖片會顯示空白,參考了plt.savefig保存圖片

    2024年02月12日
    瀏覽(18)
  • python下載文件的三種方法

    Python開發(fā)中時長遇到要下載文件的情況,最常用的方法就是通過Http利用urllib或者urllib2模塊,此外Python還提供了另外一種方法requests。 下面來看看三種方法是如何來下載文件的: 方法一: 方法二: 方法三: 看起來使用urllib最為簡單,一句語句即可。當然你可以把urllib2縮寫成

    2024年02月16日
    瀏覽(28)
  • java 逐行讀取文件(讀取文件每一行、按行讀取文件)附帶示例代碼

    最快的讀取每一行 相比較Scanner慢一點 行數(shù)達到一定規(guī)模,使用此方法讀取會非常慢 一次把所有數(shù)據(jù)都讀到內(nèi)存中,當文件非常大時,會消耗掉內(nèi)存資源導(dǎo)致程序崩掉,文件規(guī)模小推薦使用 統(tǒng)計每一行日志ip出現(xiàn)的次數(shù)

    2024年02月11日
    瀏覽(55)
  • Java 按行讀取寫入文件

    Java 按行讀取寫入文件

    目錄 一、按行讀取 二、按行寫入 這里采用java.nio.file.Files:readAllLines方法,參見JDK8 API官方文檔 Java Platform SE 8 ?具體實現(xiàn)Demo: 這里采用FileWriter與BufferWriter方法 FileWriter: 用于寫入字符流。對于寫入原始字節(jié)的流,可以考慮使用FileOutputStream。 BufferWriter: ?將文本寫入字符輸出流

    2024年02月15日
    瀏覽(25)
  • java刪除文件或目錄的三種方法

    傳統(tǒng)刪除是利用IO流,本文利用NIO流實現(xiàn)。 代碼如下(示例): 代碼如下(示例): 代碼如下(示例): 利用NIO流的好處: 1.如果刪除失敗,可以給出錯誤的具體原因; 2.代碼不多,效率高。

    2024年02月10日
    瀏覽(26)
  • linux修改文件名的三種方法

    linux修改文件名的三種方法

    我們在使用linux系統(tǒng)過程中為了便于記憶或整理維護,經(jīng)常需要對文件名進行修改,下面文章介紹了linux系統(tǒng)的三種修改文件名稱的方式。 語法:mv [options] source dest 參數(shù)說明: 示例:將a.txt修改為a1.txt 語法:cp [options] source dest 參數(shù)說明: 示例:將a.txt修改為a1.txt,通過cp命令

    2024年02月02日
    瀏覽(38)
  • Java按行讀取文件文本內(nèi)容

    Java按行讀取文件文本內(nèi)容

    在工作和學習中,有時候會有一些場景,代碼需要配合讀取文件來執(zhí)行,比如:讀文件數(shù)據(jù),來進行計算、組裝SQL、更新操作...... 下面我們來討論下,在Java中按行讀取文件文件內(nèi)容的方式有哪些? 讀取的文件內(nèi)容 測試代碼 輸出結(jié)果 分析:雖然讀取1個字符,但每行后面可能

    2024年02月15日
    瀏覽(95)
  • java中按行讀取文件內(nèi)容

    java中按行讀取文件內(nèi)容

    ? ? ? java中按行來讀取文件內(nèi)容,一般對文件也是又要求的,比如文件編碼utf-8,內(nèi)容是按行可讀,而不是一堆字節(jié)碼。這類文件,我們按行讀取,主要是方便快速查看內(nèi)容,并且用這些內(nèi)容來作別的用途,這類文件內(nèi)容不宜過多,否則加載容易出現(xiàn)意想不到的問題,比如內(nèi)

    2024年02月03日
    瀏覽(29)
  • Allegro文件導(dǎo)入SIwave仿真的三種方法

    Allegro文件導(dǎo)入SIwave仿真的三種方法

    提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 在進行PCB板級(SI/PI/EMC)仿真時,第一步需要將PCB文件導(dǎo)入至仿真軟件中。這里分享三個將Allegro PCB導(dǎo)入SIwave的方法,分別借助了ODB++、EDB、ANSYS ALinks進行中轉(zhuǎn)。 Allegro不自帶ODB++,因此該插件需要進行額

    2024年02月02日
    瀏覽(32)
  • Linux下修改文件名的三種方法

    在Linux系統(tǒng)中,有多種方法可以用來修改文件名。以下是三種常用的方法: 1. 使用 mv 命令 mv 命令是最基本也是最直接的方式來重命名文件。它的基本語法是: 打開終端 :首先,你需要打開一個命令行終端。 定位到文件所在目錄 :使用 cd 命令進入包含你想要重命名的文件的

    2024年01月17日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包