Go語言-文件操作

基本介紹

文件是數據源,數據庫也是一種特殊的文件。

Go語言中os.File結構體封裝了文件的相關操作。

打開和關閉文件


-----打開文件-----
file, err := os.Open("D:/111.txt")
if err != nil{fmt.Println("err = ", err)
}此時file就是一個指針,不包括實際的file對象內容-----關閉文件-----
err = file.Close()
if err != nil{fmt.Println("Close err = ", err)
}

讀取文件

第一種方式

適用于文件比較大的情況,帶緩沖的讀取文件。

使用bufio包。


-----打開文件-----
file, err := os.Open("D:/111.txt")
if err != nil{fmt.Println("err = ", err)
}
-----關閉文件-----
defer file.Close()
使用defer關閉file句柄,defer在函數最后執行-----讀取文件-----
創建一個*reader 帶緩沖的(內存和硬盤之間存在緩沖區,先放一塊數據到緩沖區)
reader := bufio.NewReader(file)
循環讀取文件內容
for{str, err := reader.ReadString("\n") //讀到一個換行就結束,str中包括換行if err == io.EOF{    io.EOF代表文件結束break    }fmt.Print(str)
}
fmt.Println("文件讀取完成")

第二種方式

整個文件直接讀入內存。適用于文件比較小的情況。

使用ioutil包。ioutil包目前已經被棄用。

package main
import("fmt""io/ioutil"
)func main(){file := "d:/test.txt"content, err := ioutil.ReadFile(file)if err != nil{fmt.Println("err = ", err)}fmt.Println(content)content是一個byte切片,因此需要轉一下格式fmt.Println(string(content))
}

該方式不需要顯式讀取和關閉文件。

文件寫入

?bufio包中的Reader和Writer都是有緩沖的讀寫數據。

創建文件并進行寫入

創建和讀取文件使用os包,寫入文件使用bufio包。

使用os.Openfile函數進行文件創建。

第一個參數是文件名。

第二個參數是包含以下選項。

第三個參數在linux系統下,win系統下無效,該參數是進行權限控制的。

package mainimport ("bufio""fmt""os"
)func main() {filePath := "d:/abc.txt"file, err := os.OpenFile(filePath, os.O_CREATE|os.O_WRONLY, 0666)if err != nil {fmt.Println("err = ", err)return}// 關閉文件句柄defer file.Close()writer := bufio.NewWriter(file)for i := 0; i < 5; i++ {writer.WriteString("hello,World!\n")}// WriterString帶緩存區的寫入// 因此需要writer.Flush()清空緩沖區,將內存寫入硬盤writer.Flush()}

打開存在的文件并進行內容覆蓋

file, err := os.OpenFile(filePath, os.O_TRUNC|os.O_WRONLY, 0666)

OpenFile函數中的第二個參數os.O_TRUNC代表追加;os.O_WRONLY代表寫入。

打開存在文件進行文件追加

file, err := os.OpenFile(filePath, os.O_APPEND|os.O_WRONLY, 0666)

os.O_APPEND代表追加。?

打開存在文件將內容顯示在終端,然后進行文件追加

初始化文件使用os包,讀取文件內容使用bufio包,寫入文件使用bufio包,

package mainimport ("bufio""fmt""io""os"
)func main() {filePath := "d:/abc.txt"file, err := os.OpenFile(filePath, os.O_APPEND|os.O_RDWR, 0666)if err != nil {fmt.Println("err = ", err)return}// 關閉文件句柄defer file.Close()// 讀取原來的文件內容,并輸出在終端reader := bufio.NewReader(file)for {str, err := reader.ReadString('\n')if err == io.EOF {break}fmt.Print(str)}// 追加寫入writer := bufio.NewWriter(file)for i := 0; i < 5; i++ {writer.WriteString("11111\r\n")}// WriterString帶緩存區的寫入// 因此需要writer.Flush()清空緩沖區,將內存寫入硬盤writer.Flush()}

將一個文件內容copy到另一個文件之中

讀取文件、寫入文件都使用os包。

package mainimport ("fmt""os"
)func main() {file1Path := "d:/abc.txt"file2Path := "e:/111.txt"// 讀取源文件內容data, err := os.ReadFile(file1Path)if err != nil {fmt.Println("讀取文件失敗:", err)return}// 將內容寫入目標文件err = os.WriteFile(file2Path, data, 0644)if err != nil {fmt.Println("寫入文件失敗:", err)return}fmt.Println("文件復制成功")
}

拋開錯誤處理,就兩步,一個讀,一個寫。

判斷文件是否存在

  • 使用os.Star()函數判斷是否存在。
import ("os""fmt"
)func checkExist(path string) {fileInfo, err := os.Stat(path)if err != nil {if os.IsNotExist(err) {fmt.Printf("路徑 %q 不存在\n", path)} else {fmt.Printf("發生錯誤: %v\n", err)}return}if fileInfo.IsDir() {fmt.Printf("%q 是一個目錄\n", path)} else {fmt.Printf("%q 是一個文件\n", path)}
}

os.Star(Path)?返回值:

  • 如果成功:返回一個os.FileInfo接口,包含文件/目錄的信息。
  • 如果失敗:返回一個非 nil 的 error。

判斷是否存在的標準方式

if os.IsNotExist(err) {// 路徑不存在
} else if err != nil {// 其他錯誤,比如權限不足
}

不能直接使用err == 進行判斷,就使用os.IsNotExist()進行判斷

?后續使用中一般都是封裝成函數進行使用。

文件操作編程實例

1. 編寫一個函數,將一個圖片拷貝到另一個文件夾中。

func CopyFile(src, dst string) {// 打開源文件srcFile, _ := os.Open(src)defer srcFile.Close()// 創建目標目錄(如果不存在)os.MkdirAll(filepath.Dir(dst), 0755)// 創建目標文件dstFile, _ := os.Create(dst)defer dstFile.Close()// 拷貝內容io.Copy(dstFile, srcFile)
}

在這個例子中,srcFile和dstFiled都是*os.File類型

?io.Copy()接受Writer和Reader接口類型,也就是說*os.File類型實現了io.Reader和io.Writer。直接使用沒有問題。

2. 統計一個文件中含有多少英文、數字等信息

package mainimport ("bufio""fmt""io""os"
)type CharCount struct {ChCount    int // 記錄英文個數NumCount   int // 記錄數字的個數SpaceCount int // 記錄空格的個數OtherCount int // 記錄其他字符的個數
}func main() {filePath := "d:/abc.txt"file, err := os.Open(filePath)if err != nil {fmt.Println(err)return}defer file.Close()var count CharCount// 使用帶緩沖的讀取// bufio包中是帶緩沖的讀取,讀取之前必須先拿到文件的句柄// os.ReadFile()函數不帶緩沖讀,不需要打開文件句柄,直接放入文件路徑即可reader := bufio.NewReader(file)for {str, err := reader.ReadString('\n')if err == io.EOF {break}for _, v := range str {switch {case v >= 'a' && v <= 'z':fallthrough //穿透處理,直接進入到下一個casecase v >= 'A' && v <= 'Z':count.ChCount++case v == ' ' || v == '\t':count.SpaceCount++case v >= '0' && v <= '9':count.NumCount++default:count.OtherCount++}}}fmt.Println(count)
}

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

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

相關文章

【電力物聯網】云–邊協同介紹

(??? )&#xff0c;Hello&#xff0c;我是祐言QAQ我的博客主頁&#xff1a;C/C語言&#xff0c;數據結構&#xff0c;Linux基礎&#xff0c;ARM開發板&#xff0c;網絡編程等領域UP&#x1f30d;快上&#x1f698;&#xff0c;一起學習&#xff0c;讓我們成為一個強大的技術…

《深入解析 C#(第 4 版)》推薦

《深入解析 C#&#xff08;第 4 版&#xff09;》推薦 在 C# 語言不斷演進的技術浪潮中&#xff0c;《深入解析 C#&#xff08;第 4 版&#xff09;》猶如一座燈塔&#xff0c;為開發者照亮探索的道路。無論是經驗豐富的老程序員&#xff0c;還是初入 C# 領域的新手&#xff0c…

【網絡】Linux 內核優化實戰 - net.core.netdev_max_backlog

目錄 Linux 內核參數 net.core.netdev_max_backlog 詳解一、參數概述二、參數功能與作用2.1 核心功能2.2 網絡數據包處理流程 三、查看當前參數值3.1 通過 sysctl 命令3.2 直接讀取 /proc/sys 文件 四、修改參數值4.1 臨時修改&#xff08;立即生效&#xff0c;重啟后失效&…

Nuitka 打包Python程序

文章目錄 Nuitka 打包Python程序&#x1f680; **一、Nuitka 核心優勢**?? **二、環境準備&#xff08;Windows 示例&#xff09;**&#x1f4e6; **三、基礎打包命令****單文件腳本打包****帶第三方庫的項目** &#x1f6e0;? **四、高級配置選項****示例&#xff1a;完整命…

自動獲取文件的內存大小怎么設置?批量獲取文件名和內存大小到Excel中的方法

在對重要數據進行備份或遷移操作前&#xff0c;為確保備份全面無遺漏&#xff0c;且合理規劃目標存儲設備的空間&#xff0c;會將文件名和內存提取到 Excel。比如&#xff0c;某個部門要將舊電腦中的文件遷移到新服務器&#xff0c;提前整理文件信息&#xff0c;能清晰知道所需…

創建型設計模式——單例模式

單例設計模式 什么是創建型設計模式有哪些創建型設計模式 單例設計模式實現方法餓漢式單例懶漢式單例實現方法 CSDN——C單例模式詳解 單例設計模式是一種創建型設計模式 什么是創建型設計模式 創建型設計模式&#xff0c;就是通過控制對象的創建方式來解決設計問題。 有哪…

html 照片環 - 圖片的動態3D環繞

html 照片環 - 圖片的動態3D環繞 引言一、源碼二、圖轉base64參考鏈接 引言 效果展示&#xff1a; 一、源碼 原始圖片的base64編碼字符太多了&#xff0c;博客放不下&#xff0c;將圖片縮小后的加入html的源碼如下&#xff1a; <!DOCTYPE html> <html><hea…

ADIOS2 介紹與使用指南

文章目錄 ADIOS2 介紹與使用指南什么是ADIOS2?ADIOS2 的主要特點ADIOS2 核心概念ADIOS2 安裝Linux 系統安裝Windows 安裝 ADIOS2 基本使用C 示例Python 示例 ADIOS2 高級特性并行I/O流模式 ADIOS2 引擎類型性能優化建議總結 ADIOS2 介紹與使用指南 什么是ADIOS2? ADIOS2(Ad…

網絡安全 vs 信息安全的本質解析:數據盾牌與網絡防線的辯證關系關系

在數字化生存的今天&#xff0c;每一次手機支付、每一份云端文檔、每一條醫療記錄的背后&#xff0c;都矗立著這兩座安全堡壘。理解它們的協同邏輯&#xff0c;不僅是技術從業者的必修課&#xff0c;更是企業構建數字防護體系的底層認知 —— 畢竟當勒索軟件同時切斷 "護城…

ping-pong操作

常見不匹配的原因 瞬時數據率的差異&#xff1b; 數據順序的差異&#xff1b; 對比維度PipelineFIFOPing-Pong邏輯復制結構類型時序分級推進&#xff08;寄存器鏈&#xff09;環形隊列&#xff08;緩沖區&#xff09;雙緩沖區&#xff08;輪換使用&#xff09;功能塊并行&am…

21.合并兩個有序鏈表

將兩個升序鏈表合并為一個新的 升序 鏈表并返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。 思路&#xff1a;這里使用的主要數據結構是單鏈表。該算法采用經典的雙指針技術來合并列表。 A dummy node is created; this node does not hold any meaningful value b…

vue3中簡單易懂說明nextTick的使用

nextTick(): 等待下一次 DOM 更新刷新的工具方法 重點解釋: 當你在 Vue 中更改響應式狀態時&#xff0c;最終的 DOM 更新并不是同步生效的&#xff0c;而是由 Vue 將它們緩存在一個隊列中&#xff0c;直到下一個“tick”才一起執行。這樣是為了確保每個組件無論發生多少狀態改變…

gRPC 相關介紹

介紹 依賴兩大技術 HTTP/2 作為傳輸協議 gRPC 底層用 HTTP/2&#xff0c;它支持&#xff1a; 多路復用&#xff08;在一條 TCP 連接中并行傳輸多個請求和響應&#xff09;二進制傳輸&#xff08;更緊湊、高效&#xff09;流式傳輸&#xff08;客戶端流、服務端流、雙向流&…

PyTorch 模型鏡像下載與安裝指南

在國內&#xff0c;由于網絡限制&#xff0c;直接從 PyTorch 官方源下載可能會遇到速度慢或無法訪問的問題。為了解決這一問題&#xff0c;可以使用國內鏡像源來加速下載和安裝 PyTorch。 文章目錄 安裝指定版本的 PyTorch&#xff08;以 CUDA 11.8 為例&#xff09;安裝 CPU 版…

2025年SVN學習價值分析

?? 一、SVN的現狀與應用場景分析 仍在特定領域發揮作用 傳統企業維護場景&#xff1a;在金融、電信、政府等采用集中式開發流程的機構中&#xff0c;許多遺留系統仍使用SVN管理。這些系統往往體量龐大、架構穩定&#xff0c;遷移成本高&#xff0c;因此SVN短期內不會被完全替…

JavaScript中的10種排序算法:從入門到精通

作為前端開發者&#xff0c;排序算法是我們必須掌握的基礎知識。無論是在面試中&#xff0c;還是在實際開發中處理數據展示時&#xff0c;排序都是一個常見需求。今天&#xff0c;我將用通俗易懂的方式&#xff0c;帶你了解JavaScript中最常見的10種排序算法。 1. 冒泡排序 - …

【微信小程序】6、SpringBoot整合WxJava獲取用戶手機號

1、手機號快速驗證組件 手機號快速驗證組件 旨在幫助開發者向用戶發起手機號申請&#xff0c;并且必須經過用戶同意后&#xff0c;開發者才可獲得由平臺驗證后的手機號&#xff0c;進而為用戶提供相應服務。 該能力與手機號實時驗證組件的區別為&#xff1a; 手機號快速驗證…

redis8.0新特性:原生JSON支持詳解

文章目錄 一、寫在前面二、使用1、基本命令&#xff08;1&#xff09;JSON.SET 設置 JSON 值&#xff08;2&#xff09;JSON.GET 獲取 JSON 值&#xff08;3&#xff09;JSON.DEL 刪除 JSON 值&#xff08;4&#xff09;JSON.MGET 批量獲取&#xff08;5&#xff09;JSON.MSET …

QT網絡調試助手開發全指南,軟件設計圖預研,后續文檔跟進補充

網絡調試助手 1 TCP網絡調試助手 1.1 項目概述 網絡相關的一些基礎概念學習QTcpServer 學習QTcpClient 學習TextEdit特定位置輸入文字顏色學習網絡通信相關知識點 復習鞏固之前UI控件 程序運行如下圖所示 1.2 開發流程 1.3 QTtcp 服務器的關鍵流程 工程建立&#xff0c;需要在…

網絡分層模型與協議體系技術研究報告

網絡分層模型是計算機網絡體系結構的核心框架&#xff0c;它通過將復雜的網絡通信過程分解為多個層次&#xff0c;使網絡設計、實現和維護變得更加模塊化和標準化。 一、分層模型概念 1、OSI七層模型的詳細解析 開放系統互連參考模型&#xff08;OSI/RM&#xff09;是國際標…