2021年12月21日 星期二

【Let's Go】Go關於檔案處理的一些基礎操作

 檔案處理通常是我個人在學習語言上,在接觸一些基礎與法之後,會接續關心與練習的應用之一!

這此就先整理一些有關檔案處理及資訊獲取的基本操作!

相關說明都標註在程式碼中了~~就不用再贅述浪費篇幅了!

一樣直接上程式碼🐎吧.............


package main

import (
	"fmt"
	"io/ioutil"
	"os"
)

func main() {
	w := []byte("Hello GoLang!\n我是被寫入的資料內容")

	fw, _ := os.OpenFile("file1.txt", os.O_CREATE|os.O_RDWR|os.O_APPEND, 0666)
	//os.O_CREATE|os.O_RDWR|os.O_APPEND → 可創建|可讀寫|接續新增內容(非覆寫模式)
	defer fw.Close()
	fw.Write(w)

	state, _ := fw.Stat() //獲取檔案相關資訊
	fmt.Println("檔案名稱:", state.Name())
	fmt.Println("檔案大小:", state.Size())
	fmt.Println("檔案最後修改時間:", state.ModTime())

	//ioutil.WriteFile("file1.txt", w, 0666)  //這種寫入方式會覆蓋原檔案內容

	f, _ := ioutil.ReadFile("file1.txt")
	fmt.Printf("文字檔案內容:%s", string(f))
}

檔案執行結果:



2021年12月20日 星期一

【Let's Go 爬】用Go爬圖第一步~~爬圖基礎:如何將網路圖片下載

這次依然是將之前python下載圖片的操作,試著使用Go來玩玩看!

不得不說啊~~Go果然是為著網路而生!

從上一篇用Go擷取網路新聞的操作,到這篇的網路圖片下載操作~都讓人感到一陣順心如意啊~~哈!

另外~~透過Go mod的模組管理機制,在編寫程式過程,Go也會自動引入(import)相關的模組~相當smart、便利!

這次依然示範下載google Doodle 網站中的:

https://www.google.com/logos/doodles/2021/first-day-of-school-2021-january-04-6753651837108833-2x.png

這個圖檔,作為練習範例!

好囉~~~一樣直接上程式碼🐎囉......

package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"os"
	"strings"
)

func main() {
	url := "https://www.google.com/logos/doodles/2021/first-day-of-school-2021-january-04-6753651837108833-2x.png"

	path := strings.Split(url, "/")
	name := path[len(path)-1]

	out, _ := os.Create(name)
	defer out.Close()

	r, _ := http.Get(url)
	defer r.Body.Close()

	pic, _ := ioutil.ReadAll(r.Body)
	io.Copy(out, bytes.NewReader(pic))
	//out.Write(pic)
	fmt.Printf("檔案:%s下載完成!", name)
}

使用起來算是相當便捷!

解讀一下程式,基本上一樣是透過幾個步驟~~~

1.解析獲取圖檔名:14~15行

2021年12月19日 星期日

【Let's Go】認識GoLang的模組管理go mod

 之前剛接觸Go時,還在大約1.8左右的版本

這次安裝已經來到1.17了👀😅

而GoLang在1.11之後,加入了模組管理功能~~~go.mod

讓Go在管理模組上,方便許多~~也是在開始使用GoLang之前應該要認識的基礎之一!

如果是使用JetBrains GoLand做為開發的IDE的話,基本上~當你開始一個新的專案時,GoLang會自動幫你設定go.mod這個模組管理檔案!

但假如是使用VS Code 等其他的IDE編輯開發工具,可能就需要自行去設定go.mod模組管理功能囉!

起始設定go.mod模組管理方式:「go mod init 資料夾名稱」

------------------------------------

例如:新開了一個專案的資料夾:「hello

則可以使用終端機(命令提示字元)模式,在該目錄下,輸入:go mod init hello

這樣日後當你安裝(get)新的模組時,go.mod就會自動為你紀錄模組的相依性資訊!

【Let's Go 爬】也用 Go 爬爬看~~~使用goquery爬取udn新聞網內容

 之前(一年前了~~我咧)用python的BS4練習了簡單的udn新聞網頁擷取、分析

這次趁著玩GoLang的機會,也想試試看如何用Go來完成同樣的工作。畢竟Go就是為網路而生啊~對於網路應用方面應該是更加得心應手吧!呵~~自己不負責任的胡亂猜想

好了~~不廢話了!

這次呢~~用了goquery這個模組來進行網頁內容的分析,功能就類似python中BS4模組的功能。

正好可以順道介紹一下,在Go裡面安裝模組的方式:

go get 模組名稱

=====================================================

首先:這次要安裝的goquery安裝方式如下:在終端機(命令提示字元)下輸入

go get github.com/PuerkitoBio/goquery


基本上~~goquery的使用,分成以下幾個步驟:

1.取得網頁內容: func NewDocumentFromReader(r io.Reader) (*Document, error)

2.設定查詢條件:func (s *Selection) Find(selector string) *Selection

3.獲取查詢結果:func (s *Selection) Find(selector string) *Selection

4.提取所需的網頁元素:func (s *Selection) Attr(attrName string) (val string, exists bool)

看完上述整理~~只有一個感覺~嗯...程式人的世界真是枯燥且乏味啊!(哩是滴供啥毀啦🤣)😂

好了,還是直接上程式碼🐎............


跟python BS4一樣~大概十幾二十行就可以完工(中間省略了些查核及錯誤處理)

2021年12月17日 星期五

【Let's Go】Go的基本測試與應用~基本輸出、入操作

 這次整理一下,在Go裡面的基本輸出入

基本輸出~~~

fmt.Printf   或是    fmt.Println


基本輸入~~fmt.Scanln

但是Scan的輸出要注意的是:如果輸入內容有空白符號的話,那會被切開~不會是為一個完整的句子或詞彙!

如以下範例~~輸入Wan Chih-Hsiang

但只會抓取呈現~~第一個字Wan

所以~~若是輸出具空白符號的內容時,對於Go來說,是放入二個變數中的!

2021年12月16日 星期四

【Let's Go】GoLang登場系列~~查核Go的安裝及版本

 安裝GoLang的環境其實很單純~~在不考慮其他需求的狀況下,你只要將Go的安裝程式(for Windows環境)下載並一路執行安裝,應該就可以無痛安裝完成!



安裝完成之後,首先當然要先確認你的GoLang環境確實已經可以運作了


如何確認呢~~~

簡單一點,就是:

1.檢核一下你安裝的Go版本!(有安裝完成才能執行Go命令,並看到所安裝的Go版本)

好~~~

那如何進行安裝的Go版本查核呢?

1.打開(進入)「命令提示字元」視窗~~或是所謂的「終端機」模式


2.輸入:go version


如果你的系統安裝Go環境一切正常的話,應該就會顯示你的Go版本資訊如下:


接下來就可以寫個程式世界最受歡迎的開篇小程式~~Hello World試試看囉!

2021年11月25日 星期四

【簡單玩python】~~opencv(cv2)存取中文檔案發生錯誤的解決方案

 opencv是相當強悍、好用的影像、視覺模組,在python玩樂過程中,經常有他出場的機會!







最近在試著練習使用PyQT5結合cv2做個螢幕截圖及簡易標記工具時,遇到了cv2對於中文檔名檔案的存取會發生錯誤的狀況!

這個問題當然可以說:阿~~那就不要使用中文檔名就好了嘛...

但是本著「無事生非」的精神(呵~~程式設計好玩的地方就在這裡),還是要解決這個問困擾啊!

終於~~沒多大困難的尋求了解決方案如下,做個紀錄,給自己也給其他人參考!

一般情形下,我們會透過 cv2.imread(filename) 來讀取檔案,但若是遇到讀取中文檔名時,就會遇到類似的錯誤訊息如下:


解決「讀取中文檔名」的方法,如下圖。

基本上是改用cv2.imdecode() 的方式呼叫,整體修正方式,寫成個小函式,方便隨時呼叫....


這樣,就可以正常呼叫、顯示中文檔案了!

別忘了,要引入numpy喔!

===================================================

至於「存成中文檔名」的操作~~若是使用一般 cv2.imwrite(filename, image) 則會根本沒有反應,令你以為操作是ok的,實際上根本是沒有反應,檔案也未完成寫入。

「存成中文檔名」的解決方式,如下圖。

基本上是改用,cv2.imencode(ext, image)[1].tofile(filename) 的方式執行即可正常操作。



好囉~~cv2處理中文檔案的存取操作就是這樣囉!

沒啥好掰的了~~收工!