104學習精靈

Mike的Python學院

Mike的Python學院
公開教室關注者 70 人
關注教室
Mike Ku

Learn Code With Mike品牌創辦人

2022/01/27

Python常見的檔案處理應用
本文來分別介紹幾個Python常用的檔案操作方式:
1.檢查檔案是否存在
利用 Path 模組(Module)中的exists()方法,來檢查目錄下是否含有特定的檔案,如下範例:
from pathlib import Path
file = Path("blog/about.py")
print(file.exists()) #執行結果:True
2.取得檔案資訊
利用 Path 模組(Module)中的stat()方法即可取得目錄下特定檔案的資訊,如下範例:
from pathlib import Path
file = Path("blog/about.py")
print(file.stat())
從執行結果可以看到包含了檔案的大小 st_size、修改時間 st_mtime 及建立時間 st_ctime 等。
3.重新命名檔案
利用 Path 模組(Module)中的rename()方法,並且傳入新的檔案名稱及路徑即可實現檔案重新命名的動作,如下範例:
from pathlib import Path
file = Path("blog/about.py")
file.rename("blog/info.py")
4.寫入檔案資料
利用 Path 模組(Module)中的write_text()方法,並且傳入要寫入的資料。
from pathlib import Path
file = Path("blog/readme.txt")
file.write_text("blog package document.")
5.讀取檔案資料
利用 Path 模組(Module)中的read_text()方法,即可讀取指定目錄中的檔案內容。
from pathlib import Path
file = Path("blog/readme.txt")
print(file.read_text())
6.複製檔案
在一般的情況下,我們會利用 Path 模組(Module)中的read_text()方法讀取原檔案內容,接著,再透過write_text()方法將資料寫到新檔案中,來達到複製檔案的目的,如下範例:
from pathlib import Path
old_file = Path("blog/readme.txt")
new_file = Path() / "readme.txt"
new_file.write_text(old_file.read_text())
不過,有一個更簡潔的方式可以達到相同的效果,就是利用 shutil 模組(Module)中的copy()方法,傳入原檔案及新檔案物件,如下範例:
from pathlib import Path
import shutil
old_file = Path("blog/readme.txt")
new_file = Path() / "readme.txt"
shutil.copy(old_file, new_file)
7.開啟及關閉檔案
利用open()方法來開啟檔案,接著傳入路徑及模式,而模式分別有 r (讀)、w (覆寫)及 a(續寫)三種,此方法會回傳File Object。另外,關閉檔案則呼叫close()方法,如下範例:
file = open("blog/readme.txt", "r")
print(file.readline())
file.close()
各位可能會覺得奇怪,為什麼這邊讀取檔案內容是呼叫readline()方法而不是read_text()方法?其實,這兩個方法皆可進行讀取檔案內容的動作,只是上面範例是利用 Path 物件的read_text()方法,而這邊是 File 物件的readline()方法。
另外,使用此寫法有一個缺點是,當開啟檔案後,在進行任何動作的過程中,如果有發生例外錯誤時,即有機會沒有執行到關閉檔案的動作,這會使得資源耗盡或導致下次執行時發生錯誤,所以比較好的寫法是使用 with 陳述式( The With Statement),如下範例:
with open("blog/readme.txt", "r") as file:
print(file.readline())
透過with 陳述式(The With Statement),當區塊中的檔案操作結束時,Python會動呼叫close()方法來釋放外部資源。
如果想要學習更多的Python應用教學,歡迎前往Learn Code With Mike(https://www.learncodewithmike.com/2020/02/python-files.html
)網站觀看更多精彩內容。
5 0 1847 2
Mike Ku

Learn Code With Mike品牌創辦人

2022/01/27

有效管理Python套件(Package)的工具及概念(下)
Q: pipenv套件管理工具
利用pip套件管理工具所安裝的套件(Package),是在全域環境(Global)中,當今天有兩個專案需要beautifulsoup4不同的版本,這時候將無法達成,因為全域環境無法並存兩個相同的套件(Package)。
所以就可以使用整合了pip及虛擬環境的pipenv套件管理工具,為專案建立一個獨立的虛擬環境(Virtual Environment),並且將所需的套件(Package)安裝在裡面,這樣其中的套件(Package)就不會和全域環境及其他專案互相影響。
要使用pipenv套件管理工具,需利用pip來進行安裝,如下範例:
$ pip install pipenv
安裝完成後,即可透過pipenv套件管理工具來為專案建立虛擬環境及安裝套件(Package),如下範例:
$ pip install beautifulsoup4
範例中pipenv套件管理工具為專案建立一個虛擬環境,並且在裡面安裝beautifulsoup4套件(Package)。而這個虛擬環境在哪裡呢?可以利用pipenv --ven來查看。
各位可以看到,虛擬環境並不在我們的專案中,這讓我們的專案容量,不會受到開發規模擴大時,隨著安裝的套件(Package)增多而越來越大。有了虛擬環境,接著即可透過pipenv shell進入,如下範例:
$ pip shell
執行後會發現目錄的前方多顯示了虛擬環境的名稱,代表已成功進入。這邊要注意的地方是,由於pipenv套件管理工具在虛擬環境中安裝套件(Package),所以必須進入虛擬環境後再執行應用程式,否則其中所引用的套件(Package)將會找不到而發生錯誤。
另外,利用exit指令離開虛擬環境。這時候在目錄前面則不會顯示虛擬環境的名稱。
Q: Pipfile及Pipfile.lock檔案
當執行pipenv install指令安裝套件(Package)時,會發現專案中增加了兩個檔案,分別為Pipfile及Pipfile.lock,這兩個檔案負責管理專案的套件相依性及版本。
其中的source區塊指明了安裝套件的來源。dev-package區塊為測試環境所需的套件(Package)。而packages區塊包含了專案所安裝的套件(Package),可以看到beautifulsoup4套件等於 * 符號,代表最新的版本。最後requires區塊則是執行此專案所需的Python版本。
而Pipfile.lock是一個JSON格式的檔案,其中列出了各套件詳細的版本及相依性。beautifulsoup4 4.8.2套件(Package)的相依性套件有soupsieve 1.9.5,當在安裝beautifulsoup4套件時,Python會自動將其相依性套件一起安裝,並且記錄於Pipfile.lock檔案中。
有了Pipfile及Pipfile.lock檔案,就可以很容易的在不同的電腦中,快速建立一模一樣的開發環境。舉例來說,各位可以把剛才所建立的虛擬環境檔案(\.virtualenvs\HelloPython-B6krgkNh)刪除,來模擬另一台電腦中只有專案原始碼而沒有虛擬環境,這時候只要執行以下指令:
$ pip install
無須指定任何套件名稱,pipenv套件管理工具即會自動依據專案中,Pipfile檔案的package區塊來安裝套件(Package)。
如果想要基於Pipfile.lock檔案,利用其中記錄的特定版本套件來安裝,則可以執行--ignore-pipfile指令,即忽略Pipfile檔案,而依據Pipfile.lock檔案進行安裝。
如果想要學習更多的Python應用教學,歡迎前往Learn Code With Mike(https://www.learncodewithmike.com/2020/02/python-pip-and-pipenv.html
)網站觀看更多精彩內容。
4 0 1202 1
Mike Ku

Learn Code With Mike品牌創辦人

2022/01/27

有效管理Python套件(Package)的工具及概念(上)
在實務上發展應用程式時,除了可以自行開發模組(Module)與套件(Package)外,很多時候會安裝使用第三方套件(Package),來提升專案的開發效率。
所以本文將介紹如何在PyPI中搜尋所需的Python套件(Package),並且以Windows作業系統及Visual Studio Code開發工具為例,瞭解Python強大的套件管理工具,讓您有效管理專案中的Python套件(Package)。
由於是在Visual Studio Code的Terminal視窗中下指令的方式來操作,所以使用命令提示字元視窗,也可以達到相同的效果。
Q: PyPI(Python Package Index)
PyPI是一個套件庫,位於 https://pypi.org ,其中包含了各式各樣的Python套件(Package),在開發應用程式的過程中,可以到這邊來搜尋是否有所需的功能套件(Package),安裝後透過引用的方式來進行使用,藉此提升開發效率。
現在就來介紹幾個在使用PyPI時,需要瞭解的基本功能。
各位可以在搜尋的地方查詢所需的套件,例如搜尋常應用在網路爬蟲的beautifulsoup4套件(Package),從查詢結果可以看到許多相關的套件(Package)。
以beautifulsoup4 4.8.2為例,點進此套件(Package)後,可以看到安裝的指令及最新版的發佈日期。
一個套件(Package)要如何使用,一定會有文件可以參考,往下即可看到Documentation的連結。
而套件(Package)的版本演進歷史則可以透過左邊的Release history來查看。
以上是在使用PyPI上查找套件(Package)時,較常使用的部分,接下來,就來教大家如何透過指令來安裝套件(Package)吧。
Q: pip套件管理工具
pip是一個全域環境的套件管理工具,用來安裝及管理PyPI上的Python套件(Package),也就是說利用pip指令所安裝的Python套件(Package),所有專案皆可使用。其中包含了幾個常用的操作方式,將以beautifulsoup4套件(Package)來進行示範。
1.安裝套件
使用pip install加上套件名稱,如下範例:
$ pip install beautifulsoup4
執行pip install安裝指令後,將會安裝此套件(Package)的最新版本,以此範例來說,目前beautifulsoup4套件(Package)的最新版為4.8.2,如果想要安裝特定的版本4.8.0,則可加上 == 符號,特別注意 == 符號前後不能有空白,否則會出現錯誤訊息,如下範例:
$ pip install beautifulsoup4==4.8.0
另外,如果想要安裝版號為4.7開頭的最新版,也就是4.7.1,則可以使用 * 符號來進行安裝,如下範例:
$ pip install beautifulsoup4==4.7.*
同樣的,如果想要安裝版號為4開頭的最新版,也就是4.8.2,則可執行以下指令:
$ pip install beautifulsoup4==4.*
2.升級套件
使用pip install --upgrade加上套件名稱來進行升級,如下範例:
$ pip install --upgrade beautifulsoup4
3.列出套件清單
使用pip list來檢視電腦中目前已安裝的套件及版本,如下範例:
$ pip list
4.移除套件
使用pip uninstall加上套件名稱來進行移除的動作,如下範例:
$ pip uninstall beautifulsoup4
如果想要學習更多的Python應用教學,歡迎前往Learn Code With Mike(https://www.learncodewithmike.com/2020/02/python-pip-and-pipenv.html
)網站觀看更多精彩內容。
3 0 910 0
Mike Ku

Learn Code With Mike品牌創辦人

2022/01/25

解析Python模組和套件的概念(3)
本文接續「解析Python模組和套件的概念(2)」文章分享模組和套件的概念。
Q: 什麼是套件(Package)
就是一個容器(資料夾),包含了一個或多個的模組(Module),並且擁有__init__.py檔案,其中可以撰寫套件(Package)初始化的程式碼。
我們將程式碼模組化後,專案中的模組(Module)就會越來越多,這時候就可以再將相似的模組(Module)組織為套件(Package)。那要如何建立套件(Package)呢?
舉例來說,現在我們要將專案中的 post.py 及 about.py 模組(Module)打包為部落格套件(Package),首先,建立blog資料夾,接著在資料夾中新增__init__.py檔案,最後將 post.py 及 about.py 模組(Module)移至blog資料夾中。
而在主程式 app.py 中引用套件(Package)的方式和模組(Module)大同小異,我們先來看 from-import語法,如下範例:
# 從套件中引用模組
from blog import post
from blog import about
p = post.Post()
p.add_post("Python Programming")
author = about.get_author()
email = about.get_email()
另一個引用套件(Package)的 import 語法如下範例:
# 從套件中引用模組
import blog.post
import blog.about
p = blog.post.Post()
p.add_post("Python Programming")
author = blog.about.get_author()
email = blog.about.get_email()
Q: dir()函式(dir function)
Python提供了一個內建函式dir(),用來顯示物件(Object)的屬性(Attribute)及方法(Method),我們利用此函式(Function)來看一下模組(Module)所擁有的屬性(Attribute)及方法(Method),如下範例:
#從blog套件引用about模組
from blog import about
print(dir(about))
從執行結果可以看到模組(Module)中有自建的get_author及get_email方法(Method),其餘的則是Python自動幫我們產生的,我們來看幾個常用的屬性(Attribute),如下範例:
# 從blog套件引用about模組
from blog import about
print(about.__name__) # 模組名稱
print(about.__package__) # 套件名稱
print(about.__file__) # 模組的檔名及路徑
如果想要學習更多的Python應用教學,歡迎前往Learn Code With Mike(https://www.learncodewithmike.com/2020/01/python-module-and-package.html
)網站觀看更多精彩內容。
1 0 635 0
Mike Ku

Learn Code With Mike品牌創辦人

2022/01/25

解析Python模組和套件的概念(2)
本文接續「解析Python模組和套件的概念(1)」文章分享模組和套件的概念。
Q: 模組引用方式(Import)
我們將程式碼進行模組化後,主程式 app.py 要如何使用呢?首先,可以使用 from-import 語法,如下範例:
# 引用模組中的特定物件
from post import Post
from about import get_author, get_email
p = Post()
p.add_post("Python Programming")
author = get_author()
email = get_email()
print(p.titles) #執行結果:['Python Programming']
print(author) #執行結果:Mike
print(email) #執行結果:example@gmail.com
from 之後加上模組(Module)的檔名,注意沒有 .py 副檔名,接著 import 引用所需的物件。
當然,在 import 之後可以使用 * 來引用模組中的所有物件,但是這樣的寫法,可能會在引用的過程中,發生同名方法覆寫(Method Overriding)的風險,所以建議引用所需要的物件即可。另一種語法則是透過 import 語法,如下範例:
# 引用整個模組
import post
import about
p = post.Post()
p.add_post("Python Programming")
author = about.get_author()
email = about.get_email()
print(p.titles) #執行結果:['Python Programming']
print(author) #執行結果:Mike
print(email) #執行結果:example@gmail.com
import 之後加上模組(Module)的檔名,和上一個語法不一樣的地方是,此語法雖然引用整個模組(Module),但是在主程式中必須透過模組(Module)的名稱來存取其中的成員。
在主程式 app.py 中引用模組(Module),並且執行後,會發現多了一個 pycache 資料夾。
這個資料夾中,可以看到包含了引用模組的已編譯檔案,當下一次執行主程式 app.py 時,Python編譯器看到已編譯的模組檔案,會直接載入該模組(Module),而省略編譯的動作,藉此來加速載入模組(Module)的速度。
當然Python編譯器在每一次執行時,會檢查來源模組及已編譯檔案的時間,當來源模組的時間較新,則代表該模組(Module)有經過修改,則Python編譯器會再編譯一次,更新已編譯檔案。
各位有沒有覺得奇怪,那為什麼沒有 app.py 的已編譯檔案,因為在此範例中,我們將 app.py 當作程式的進入點,所以每一次執行python app.py 指令時,Python編譯器都要進行編譯,所以沒有將 app.py 進行快取的動作。
如果想要學習更多的Python應用教學,歡迎前往Learn Code With Mike(https://www.learncodewithmike.com/2020/01/python-module-and-package.html
)網站觀看更多精彩內容。
2 0 421 0
Mike Ku

Learn Code With Mike品牌創辦人

2022/01/25

解析Python模組和套件的概念(1)
當我們在開發大型應用程式時,如果沒有適當的組織程式碼,除了會降低開發的效率外,也不易於維護,所以模組(Module)化就顯得相當的重要,讓程式碼能夠透過引用的方式來重複使用,提升重用性(Reusable)。
但是隨著專案模組(Module)的增加,將難以管理及問題的追蹤,這時候就能將模組(Module)打包成套件(Package),利用其階層式的結構來彈性規劃模組(Module)。
本篇文章就帶大家瞭解Python模組(Module)及套件(Package)的重要觀念。
Q: 什麼是模組(Module)
模組(Module)就是一個檔案,包含了相關性較高的程式碼。隨著應用程式的開發規模越來越大,我們不可能把所有的程式碼都寫在同一份Python檔案中,一定會將關聯性較高的程式碼抽出來放在不同的檔案中來形成模組(Module),主程式再透過引用的方式來使用。所以模組(Module)可以提高程式碼的重用性(Reusable)且易於維護。
假設我們現在要開發一個部落格,主程式為 app.py ,在還沒有模組化時,程式碼可能長得像這樣:
#取得作者
def get_author():
return "Mike"
#取得電子郵件
def get_email():
return "example@gmail.com"
#新增文章
def add_post(title):
pass
#刪除文章
def delete_post(title):
pass
add_post()
author = get_author()
email = get_email()
各位應該可以想像,隨著部落格功能的增加,將所有程式碼都寫在 app.py 主程式中會變得怎麼樣。所以這時候就可以將相關性較高的功能進行模組化的動作。
以此範例來說,取得作者及電子郵件可以獨立出來建立一個關於模組(about.py),而新增及刪除文章則可以獨立出來為文章模組(post.py),專門處理文章相關的動作,如下範例:
about.py
#取得作者
def get_author():
return "Mike"
#取得電子郵件
def get_email():
return "example@gmail.com"
post.py
#新增文章
def add_post(title):
pass
#刪除文章
def delete_post(title):
pass
當然,模組(Module)除了可以包含函式(Function)外,也可以為類別(Class),我們以 post.py 為例:
class Post:
# 建構式
def __init__(self):
self.titles = []
# 新增文章
def add_post(self, title):
self.titles.append(title)
# 刪除文章
def delete_post(self, title):
self.titles.remove(title)
所以現在我們專案中有一個主程式 app.py 及兩個模組(Module),分別為 about.py 和 post.py。
如果想要學習更多的Python應用教學,歡迎前往Learn Code With Mike(https://www.learncodewithmike.com/2020/01/python-module-and-package.html
)網站觀看更多精彩內容。
2 0 313 0
Mike Ku

Learn Code With Mike品牌創辦人

2022/01/21

不可不知的Scrapy框架爬取下一層網頁資料實作
本文以INSIDE硬塞的網路趨勢觀察網站( https://www.inside.com.tw/ )首頁的熱門文章為例,來和大家分享如何在Scrapy框架中爬取下一層的網頁內容。
Q: Scrapy網頁爬蟲爬取下一層網頁內容
建立Scrapy網頁爬蟲檔案(hot_news.py),在parse()方法(Method)的地方,透過Scrapy框架的xpath()方法(Method),來爬取INSIDE硬塞的網路趨勢觀察網站的所有熱門文章下一層網頁網址,如下範例:
import scrapy
class HotNewsSpider(scrapy.Spider):
name = 'hot_news'
allowed_domains = ['www.inside.com.tw']
def parse(self, response):
post_urls = response.xpath(
"//a[@class='hero_menu_link']/@href").getall()
詳細的Scrapy xpath定位元素方法教學可以參考[Scrapy教學5]掌握Scrapy框架重要的XPath定位元素方法文章( https://www.learncodewithmike.com/2021/01/scrapy-xpath-selectors.html )。取得了所有熱門文章的下一層網頁網址後,就可以透過迴圈來進行請求,如下範例:
import scrapy
class HotNewsSpider(scrapy.Spider):
name = 'hot_news'
allowed_domains = ['www.inside.com.tw']
def parse(self, response):
post_urls = response.xpath(
"//a[@class='hero_menu_link']/@href").getall()
for post_url in post_urls:
yield scrapy.Request(post_url, self.parse_content)
其中Request方法(Method)的第一個參數,就是「請求網址」,也就是熱門文章的下一層網頁網址,而第二個參數就是請求該網址後,所要執行的方法(Method),而parse_content()方法(Method)中,就是來爬取熱門文章的下一層網頁內容,以本文為例就是包含「文章標題」及「文章摘要」。
接著,就可以在parse_content()方法(Method)中,同樣使用Scrapy框架的xpath()方法(Method),來爬取「文章標題」及「文章摘要」,如下範例:
import scrapy
class HotNewsSpider(scrapy.Spider):
...
def parse_content(self, response):
# 熱門文章標題
hot_news_title = response.xpath(
"//h1[@class='post_header_title js-auto_break_title']/text()").get()
# 熱門文章摘要
hot_news_intro = response.xpath(
"//div[@class='post_introduction']/text()").get()
print(f"熱門文章標題:{hot_news_title},\n熱門文章摘要:{hot_news_intro}")
利用以下的指令執行Scrapy網頁爬蟲:
$ scrapy crawl hot_news
如果想要學習更多的Python應用教學,歡迎前往Learn Code With Mike(https://www.learncodewithmike.com/2021/02/scrapy-follow-links-and-collect-data.html
)網站觀看更多精彩內容。
2 0 570 0
關於教室
Mike與104學習精靈合作,在這邊分享Learn Code With Mike網站上部分的Python「入門教學、爬蟲應用、資料分析與網頁開發」等主題的教學文章,而這也是Learn Code With Mike品牌的初衷,以簡單易懂的實作幫助大家學習Python程式語言。​
學習發起人
Mike Ku
Learn Code With Mike品牌創辦人
0 回答 65 分享 1 教室
發起人簡介
目前還沒有關於老師的更多介紹 ...更多