`取自《初學Python的第一本書 從基本語法到模組應用》`
系統模組(os) (Operating System 作業系統):
提供所使用的作業系統一些功能,EX:檔案的路徑檢查、列出檔案列表、檔案複製/移動/改名/刪除等
⚠️ 使用 os 要先 import
看某個檔案或目錄是否存在於特定位置,可使用os.path.exists()
* 相對路徑:從現在的資料夾為基準出發,前面會有一個 ./ 或 . 開頭
(一個點代表現在所在位置;兩個點代表上一層)
* 絕對路徑:從Unix的根目錄或Windows的C槽D槽之類的起始點出發
(多加一個 \ 將可能造成的轉義去除)
```
os.path.isfile() / os.path.isdir():檢查這個路徑是否是檔案 / 資料夾的方法
os.path.join():處理路徑和檔案的結合
shutil.copy() / shutil.move():複製和移動檔案(參數前面寫來源,後面寫目的地)
os.rename():修改名字,也可作為移動檔案用
os.mkdir() / os.rmdir():新增 / 刪除**資料夾**
os.remove():刪除**檔案**
os.listdir:列出資料夾的所有檔案及資料夾(只會列出第一層)
os.walk():將整個資料夾,連同子資料夾都走過一遍,走完後所有內容會以
(dirpath, dirnames, filenames)的形式回傳,
可使用for...in...取得
⚠️ 必須要給一個起始點('.')
```
⚠️ 如果想要刪除某個目錄以下的所有檔案及資料夾,要特別注意top起始點是「/」(根目錄),而非「./」(當前目錄),否則整個檔案系統都會砍光
---
日期與時間的相關模組:datetime跟time
**datetime模組:**
* date物件用法
```
from datetime import date
doubleten = date(年, 月, 日)
print(doubleten.year, doubleten.month, doubleten.day)
```
* isoformat() / str():可將日期轉成用「 - 」連接的字串
```
print(doubleten.isoformat(), str(doubleten))
```
* date.today():取到系統時間的今天
```
today = date.today() # isoformat格式會補0
```
* weekday():0~6,0是星期一,6是星期日
* isoweekday():1~7,1是星期一,7是星期日
```
today.weekday(), today.isoweekday()
```
* strftime():用來格式化想要的顯示樣態和目標
```
print(today.strftime('%Y--%m--%d, WeekDay: %a'))
```
⚠️ %Y 年;%m 月;%d 日;%a 星期幾的縮寫;%H 小時;%M 分;%S 秒
* time物件用法:
```
from datetime import time
print(time()) # 00:00:00 # datetime的time.time()預設是從0開始
now = time()
print(now.isoformat()) # 00:00:00
now = time(0,0,0,38) # 最小單位到微秒(百萬分之一秒,也就是10e-6)
print(now.microsecond) # 取微秒 38
now = time(hour=19, second=50)
print(str(now)) # 19:00:50
print(now.strftime('%H-%M')) # 19-00
```
* datetime.datetime():全都要
```
from datetime import datetime
print(datetime.today()) # 現在的時間,計到微秒
print(datetime.utcnow()) # UTC標準時間
```
* str()轉換:使用空格
* isoformat():使用「 T 」來分隔
```
print(str(datetime.now)) # 2024-07-31 13:12:55.223883
print(datetime.now().isoformat()) # 2024-07-31T13:13:50.514944
```
* timedelta():時間差
```
from datetime import date, datetime, time, timedelta
valentine = date(2023, 11, 28)
today = date.today()
romanticlen = today - valentine # 交往時間
print(romanticlen) # 246 days, 0:00:00
remember = [100, 200, 520, 1000, 2000] # 要記得的幾個紀念日
memorialday = [valentine + timedelta(days=i) for i in remember]
print(memorialday)
# [datetime.date(2024, 3, 7), datetime.date(2024, 6, 15),
# datetime.date(2025, 5, 1), datetime.date(2026, 8, 24),
# datetime.date(2029, 5, 20)]
diff = [i - today for i in memorialday]
print(diff)
# [datetime.timedelta(days=-146),
# datetime.timedelta(days=-46), datetime.timedelta(days=274),
# datetime.timedelta(days=754), datetime.timedelta(days=1754)]
```
⚠️ 也可用乘上數字來和定點日期相加減計算
**time模組:**
* time.time():給出Unix標準時間
* localtime():現在所在時區的時間
```
import time
print(time.time()) # 1722410073.638067
print(time.localtime())
# time.struct_time(tm_year=2024, tm_mon=7, tm_mday=31, tm_hour=15,
# tm_min=16, tm_sec=35, tm_wday=2, tm_yday=213, tm_isdst=0)
```
* struct_time():給定一個時間方便處理
* time.ctime() / time.strftime():將其轉換成易讀的字串
```
now = time.localtime()
print(time.ctime()) # Wed Jul 31 15:59:56 2024
print(time.strftime('現在是%A, %Y年%m月%d日的%H時%M分%S秒', now))
# 現在是Wednesday, 2024年07月31日的16時05分09秒
```
* time.sleep():讓程式暫時停止執行指定的秒數,待時間到才繼續運作
```
import os, time
start = time.time()
for path, dirs, files in os.walk('.'):
print(path)
for f in files:
print(os.path.join(path, f))
for d in dirs:
print(os.path.join(path, d))
time.sleep(10)
end = time.time()
print("總耗時:%f" % (end - start))
```
---
python -m :可以呼叫一些標準函式庫的方法並輸入一些參數
* timeit.timeit(stmt, setup, timer, number)
| 參數 | 意義 |
| ------ |:----------------------------------------------:|
| stmt | 被量測的程式碼 |
| setup | 開始前可能有一些前置的設定要做的話,就放在這裡 |
| timer | 請忽視,這是預設的timer |
| number | stmt執行的次數 |
⚠️ stmt 也可直接傳入函數名稱,後面就不用加括號,因為是當成一個**函數物件**
```
import timeit
timeit.timeit("'-'.join(str(n) for n in range(100))")
```
⚠️ 預設是一百萬次
```
timeit.timeit(stmt='x=3;y=5;res=x*y')
```
⚠️ 如需多行,要使用分號分隔不同行
```
timeit.repeat(stmt='x=3;y=5;res=x*y', number=10000, repeat=7)
```
⚠️ 想重複timeit的測量,可使用timeit.repeat()
---
1. PIL (Python Imaging Library):是一套影像處理的模組,可以做到一些常見的影像處理和操作,比如裁切、平移、旋轉、縮放,調整亮度、色調,套用濾鏡等。
Image.open():可讀入一個圖檔
format、size、mode 則分別可以檢視圖檔格式、大小(寬跟高)以及色彩模式
* 順時針旋轉 rotate
* 裁切 crop:必須使用Tuple傳入,4個數分別代表左上(x1, y1) / 右下(x2, y2)
* 調整大小 resize:需要以Tuple表示
| 屬性 / 方法 | 用途 |
| ----------- |:---------------------------------------------------- |
| format | 顯示圖檔格式 |
| size | 顯示大小(寬跟高) |
| mode | 顯示色彩模式 |
| show | 顯示圖片 |
| rotate | 將圖片順時針旋轉 |
| crop | 將圖片裁切成指定大小(輸入左上角和右下角的座標) |
| paste | 將一個圖片貼到另一個圖片上面(輸入要貼上的圖片和位置 |
| save | 存檔(輸入要存的檔名) |
2. ImageDraw:繪圖模組,用來處理繪製各種常見圖形以及文字的方法
⚠️ 若要用空白畫布來繪製,可以用Image.new("RGB", (400, 300))的形式建立
---
* GUI (Graphical User Interface) 介面:有圖形化的互動介面,最常見的有 Tkinter / PyQT / WxPython / Kivy
* Frame 區塊:用來切分視窗以便進行排版
* Button 按鈕:運用textvariable的參數來給定tk.StringVar變數,可以用來動態調整按鈕上的字的變化
⚠️ tk的變數有StringVar, IntVar, DoubleVar等三種,set()用以設定變數,get()用以取得變數內容
* 單純想要**顯示文字**,不想被使用者修改,要使用**文字標籤(Label)**
* 想要**被輸入的文字方塊**的話,使用**文字輸入欄(Entry)**
* 想要使用**單選的選項**的話,使用**單選按鈕(Radiobutton)**
* 想要**跳出提示方塊**的話,要使用**對話框(Messagebox)**