golang的文件操作

獲取文件列表路徑

package _caseimport ("fmt""log""os""strings"
)// 獲取文件路徑
// 源文件目錄
const sourceDir = "file/"// 目標文件目錄
const destDir = "det_file/"// 拿到目錄下完整的路徑
func geFiles(dir string) []string {//讀取目錄fs, err := os.ReadDir(dir)if err != nil {log.Fatal()}//定義一個list接收我們的文件路徑list := make([]string, 0)for _, f := range fs {//如果是個空的文件夾就繼續if f.IsDir() {continue}//去掉字符串s中首部以及尾部與字符串cutset中每個相匹配的字符   //Name返回條目所描述的文件(或子目錄)的名稱。fullName := strings.Trim(dir, "/") + "/" + f.Name()list = append(list, fullName)fmt.Println(list)}return list
}

文件目錄拷貝

package _case//文件復制
import ("io""log""os""path"
)// 拷貝目錄到目錄
func Copy() {list := geFiles(sourceDir)for _, f := range list {//Split 函數將路徑從最后一個斜杠后面位置分隔為兩個部分( dir 和 file )并返回。如果路徑中沒有斜杠,//函數返回值 dir 會設為空字符串, file 會設為 path 。兩個返回值滿足 path == dir+file_, name := path.Split(f)                 //把文件名輸出destFileName := destDir + "copy/" + name //這個name是把文件名放在了目標文件加后//fmt.Println(destFileName)//復制文件CopyFile(f, destFileName)}
}func CopyFile(srcName, destName string) (int64, error) {//打開源文件src, err := os.Open(srcName)if err != nil {log.Fatal(err)}defer src.Close()//打開目標文件   可讀可寫可創建det, err := os.OpenFile(destName, os.O_CREATE|os.O_WRONLY, 0644)if err != nil {log.Fatal(err)}defer det.Close()return io.Copy(det, src)
}
一次性讀取文件內容并寫入

讀取文件內容并寫入

package _caseimport ("log""os""path"
)// 一次性讀取文件內容并寫入
func ReadWriteFiles() {//獲取源文件路徑list := geFiles(sourceDir)for _, f := range list {bytes, err := os.ReadFile(f)if err != nil {log.Fatal(err)}_, name := path.Split(f)destname := destDir + "normal/" + nameerr1 := os.WriteFile(destname, bytes, 0644)if err1 != nil {log.Fatal(err1)}}
}

分片讀取文件并寫入

package _caseimport ("io""log""os""path"
)// 適用大文件
// 分片讀取文件內容分布寫入新文件
func OneSideReadWriteToDest() {list := geFiles(sourceDir)for _, f := range list {_, name := path.Split(f)destFileName := destDir + "one_side/" + name//文件寫入OneSideReadWrite(f, destFileName)}
}
func OneSideReadWrite(srcName, destName string) {src, err := os.Open(srcName)if err != nil {log.Fatal("1", err)}defer src.Close()dst, err := os.OpenFile(destName, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)if err != nil {log.Fatal("2", err)}defer dst.Close()//切片 文件最大的限度buf := make([]byte, 1024)for {n, err := src.Read(buf)if err != nil && err != io.EOF { //如果沒有這個io.EOF的話就會報錯log.Fatal("3...", err)}if n == 0 {break}dst.Write(buf[:n])}}

一次性讀取按行拆分

const README = "README.MD"
func ReadLine1() {fileHeader, err := os.OpenFile(README, os.O_RDONLY, 0444)if err != nil {log.Fatal(err)}defer fileHeader.Close()//將文件一次性讀取出來bytes, err := io.ReadAll(fileHeader)if err != nil {log.Fatal(err)}list := strings.Split(string(bytes), "\n")for _, i := range list {fmt.Println(i)}}

按行讀取用于大文件

bufio 通過對io模塊的封裝提供了數據的緩沖功能,能一定程度減少大文件數據塊帶來的開銷。當發起讀寫操作時,會嘗試從緩沖區讀取數據,緩沖區沒有數據后,才會從數據源去讀取緩沖區大小默認為4k

func ReadLine2() {fileHeader, err := os.OpenFile(README, os.O_RDONLY, 0444)if err != nil {log.Fatal(err)}defer fileHeader.Close()reader := bufio.NewReader(fileHeader)for true {//加上分隔符line, err := reader.ReadString('\n')if err == io.EOF {break}fmt.Print(line)}
}func ReadLine3() {fileHeader, err := os.OpenFile(README, os.O_RDONLY, 0444)if err != nil {log.Fatal(err)}defer fileHeader.Close()scanner := bufio.NewScanner(fileHeader)for scanner.Scan() {line := scanner.Text()fmt.Println(line)}
}

Scanner按行讀取文件

先使用 NewScanner() 創建 Scanner 對象。然后在 for 循環中,使用 Scanner 的 Scan() 方法讀取文件的每一行,在使用 Text() 方法獲取每一行的內容。最后,將獲取到的行追加到字符串切片中。

func ReadLines(path string) ([]string, error) {file, err := os.Open(path)if err != nil {return nil, err}defer file.Close()var lines []stringscanner := bufio.NewScanner(file)for scanner.Scan() {lines = append(lines, scanner.Text())}return lines, scanner.Err()
}

Reader 讀取每一行

使用 bufio.Reader 時,需用 ReadBytes() 或 ReadString() 方法來讀取每一行。使用 NewReader() 函數創建一個 Reader 對象。在 for 循環中,我們使用 ReadString() 函數讀取每一行的內容,并將其追加到字符串切片中。

func ReadLinesV2(path string) ([]string, error) {file, err := os.Open(path)if err != nil {return nil, err}defer file.Close()var lines []stringreader := 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
}

ReadLine 按行讀取

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

func ReadLinesV3(path string) ([]string, error) {f, err := os.Open(path)if err != nil {return nil, err}defer f.Close()var lines []stringr := 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() 方法可以讀取一行數據,但是需要注意它的返回值。ReadLine() 函數的返回值包括三個部分:讀取到的數據、是否讀取完整一行以及錯誤信息。如果讀取到的數據超出了緩存區的大小,它會返回一個錯誤信息,而不是完整的一行數據。

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

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/210648.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/210648.shtml
英文地址,請注明出處:http://en.pswp.cn/news/210648.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python數據科學視頻講解:數據挖掘與建模的注意事項

1.7 數據挖掘與建模的注意事項 視頻為《Python數據科學應用從入門到精通》張甜 楊維忠 清華大學出版社一書的隨書贈送視頻講解1.7節內容。本書已正式出版上市,當當、京東、淘寶等平臺熱銷中,搜索書名即可。內容涵蓋數據科學應用的全流程,包括…

sensitive word 敏感詞(臟詞) 如何忽略無意義的字符?達到更好的過濾效果?

忽略字符 說明 我們的敏感詞一般都是比較連續的,比如 傻帽 那就有大聰明發現,可以在中間加一些字符,比如【傻!#$帽】跳過檢測,但是罵人等攻擊力不減。 那么,如何應對這些類似的場景呢? 我們可以指定特…

CSS3技巧36:讓內容垂直居中的三種方式

讓內容垂直居中,是一個很重要的應用情景,在很多場合都會需要。這也是面試的時候,一些考官喜歡拿來初面的小題目。 這里,小結下讓內容垂直居中的三種方式。 當然,讀者如果有更好的方法,也可以提出來。 基本…

基于ssm技術的車庫智能管理平臺論文

摘 要 現代經濟快節奏發展以及不斷完善升級的信息化技術,讓傳統數據信息的管理升級為軟件存儲,歸納,集中處理數據信息的管理方式。本車庫智能管理平臺就是在這樣的大環境下誕生,其可以幫助管理者在短時間內處理完畢龐大的數據信息…

【自定義Source、Sink】Flink自定義Source、Sink對redis進行讀寫操作

使用ParameterTool讀取配置文件 Flink讀取參數的對象 Commons-cli: Apache提供的,需要引入依賴ParameterTool:Flink內置 ParameterTool 比 Commons-cli 使用上簡便; ParameterTool能避免Jar包的依賴沖突 建議使用第二種 使用Par…

西工大網絡空間安全學院計算機網絡實驗五——ACL配置

實驗五、ACL配置 一. 實驗目的 1. 掌握ACL的基本配置方法 二. 實驗內容 1. 基于如下圖所示的拓撲圖,對路由器進行正確的RIP協議配置; ? 首先引入3臺2811 IOS15型號的路由器、3臺2950-T24型號的交換機、4臺PC-PT型號的PC機、兩臺Server-PT型號的服務…

kafka學習筆記--生產者消息發送及原理

本文內容來自尚硅谷B站公開教學視頻,僅做個人總結、學習、復習使用,任何對此文章的引用,應當說明源出處為尚硅谷,不得用于商業用途。 如有侵權、聯系速刪 視頻教程鏈接:【尚硅谷】Kafka3.x教程(從入門到調優…

JavaScript 的節流與防抖

// 函數防抖: 在事件被觸發 n 秒后再執行回調,如果在這 n 秒內事件又被觸發,則重新計時。// 函數節流: 規定一個單位時間,在這個單位時間內,只能有一次觸發事件的回調函數執行,如果在同一個單位…

Redis各種數據結構應用場景

Redis各種數據結構應用場景 一、基本類型 Redis的基本數據類型時,以下是它們的實際場景示例: 字符串(String): 實際場景 緩存數據:將頻繁訪問的數據緩存在Redis中,以提高讀取速度。會話管理&…

Ubuntu與Windows通訊傳輸文件(FTP服務器版)(沒用的方法,無法施行)

本文介紹再Windows主機上建立FTP服務器,并且在Ubuntu虛擬機上面訪問Windows上FTP服務器的方法 只要按照上圖配置就可以了 第二部:打開IIS管理控制臺 右擊網站,新建FTP站點。需要注意的一點是在填寫IP地址的時候,只需要填寫Window…

遙感衛星綜述(下載和預處理)(持續更新)

遙感衛星綜述(下載和預處理) 目錄 遙感衛星綜述(下載和預處理)一、國產衛星GF-1 WFV 二、國外衛星Sentinel-1Sentinel-2 一、國產衛星 GF-1 WFV 下載 分辨率波段16m4(藍、綠、紅、近紅) 預處理: ENVI預處理GF-1號W…

用友T3如何反結賬、反記賬、反審核及刪除憑證

在T3總賬中已經進行了總賬記賬和月末結賬,但是需要去修改憑證或刪除憑證,這個時候就需要去進行反結賬、反記賬等操作,以下是具體的操作流程 第一步、反結賬 1、進入用友T3件,打開總賬系統模塊,點月末結賬&#xff0c…

uc_15_TCP協議

1 TCP協議 TCP提供客戶機與服務器的鏈接。一個完整TCP通信過程需要經歷三個階段 1)首先,客戶機必須建立與服務器的連接,所謂虛電路 2)然后,憑借已建立好的連接,通信雙方相互交換數據 3)最后&am…

短信驗證碼無法獲取,通過獲取cookies直接登錄

web端,selenium短信驗證碼無法獲取,通過獲取cookies直接登錄 1,先獲取cookies driver webdriver.Chrome() driver.get("") driver.implicitly_wait(2) # 獲取彈窗,并取消 driver.find_element(By.XPATH,"/html/…

智能優化算法應用:基于粒子群算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼

智能優化算法應用:基于粒子群算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼 文章目錄 智能優化算法應用:基于粒子群算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼1.無線傳感網絡節點模型2.覆蓋數學模型及分析3.粒子群算法4.實驗參數設定5.算法結果6.參考文…

Python---異常的綜合案例

☆ 異常的傳遞 需求: ① 嘗試只讀方式打開python.txt文件,如果文件存在則讀取文件內容,文件不存在則提示用戶即可。 ② 讀取內容要求:嘗試循環讀取內容,讀取過程中如果檢測到用戶意外終止程序,則except捕…

個人博客網站如何實現https重定向(301)到http

對于個人網站站注冊比較少的,服務器配置不是很好的,沒必要https,https跳轉到http是要時間的,會影響網站打開的速度。免費的https每年都要更換。個人博客網站https有一段時間了,而且很多頁面都有收錄排名,現在已去掉htt…

基于JavaWeb+SSM+Vue實習記錄微信小程序系統的設計和實現

基于JavaWebSSMVue實習記錄微信小程序系統的設計和實現 源碼獲取入口Lun文目錄前言主要技術系統設計功能截圖訂閱經典源碼專欄Java項目精品實戰案例《500套》 源碼獲取 源碼獲取入口 Lun文目錄 目 錄 摘 要 III Abstract 1 1 系統概述 1 1.1 概述 2 1.2課題意義 3 1.3 主要內…

【Linux系統編程】進度條的編寫

目錄 一,進度條的必備知識 1,緩沖區的粗略介紹 2,回車與換行 二,進度條的初步制作 1,進度條的初步礦建 2,進度條的版本一 3,進度條的版本二 一,進度條的必備知識 1&#xff…

詳細了解STM32----GPIO

提示:永遠支持免費開源知識文檔,喜歡的點個關注吧!謝謝! 文章目錄 一、什么是GPIO?二、GPIO基本結構三、GPIO的輸入輸出模式1、推挽輸出2、開漏輸出3、復用推挽4、復用開漏1、浮空輸入2、上拉輸入3、下拉輸…