BACK
Featured image of post 智慧商業Python數據分析與應用班(版本3.*)

智慧商業Python數據分析與應用班(版本3.*)

本文為本人參訓勞工局在職訓練班的Python課程的學習筆記。

指導教師:李菊權(0921-763623)

python(版本3.8.2)

安裝至環境變數(Windows10)

  • Add Python 3.8 to PATH

若沒勾選,需自行到(以下兩種方式進入環境變數設定)

  1. 本機 ▸ 內容
  2. 控制台 ▸ 系統及安全性 ▸ 系統
    進階系統設定 ▸ 系統內容 ▸ 進階 ▸ 環境變數
    將python.exe目錄新增至環境變數
    (PATH ▸ 編輯 ▸ 新增)
1
2
3
4
5
6
7
8
9
### python.exe預設位置(Windows10)
C:\Users\user\AppData\Local\Programs\Python\Python38-32\

### 找python.exe(Windows10)
where python.exe
> C:\Users\user\AppData\Local\Programs\Python\Python38-32\python.exe

### 將以下此段路徑新增至環境變數
### C:\Users\user\AppData\Local\Programs\Python\Python38-32\

Python介紹

Python 動態型別(強型別)/直譯式語言

  • 動態型別:使用變數時不須預先宣告型別,依照設定之值而變。
  • 強型別:不同型別無法進行運算。
  • 直譯式語言:不須經過編譯即可直接執行。
  • 副檔名:.py

IDLE

  • python官方提供的IDE

推薦開發環境 Anaconda

  • Spyder - 整合開發程式

Python Shell (REPL)

Python Shell (REPL) 模式

進入Python Shell (REPL)

1
2
python
>>>        # 開頭變成>>>代表進入python shell

離開Python Shell (REPL)

1
quit()

清除當前Python Shell Screen

1
cls

Python Plugin

作業系統模組 - os

  • 載入模組
1
import os               # 匯入系統模組
  • 打開系統的指定程式 - os.system(程式名)
1
2
os.system("mspaint")    # 打開小畫家
os.system("calc")       # 打開計算機
  • 列出目錄中所有檔案 - os.listdir(路徑)
1
os.listdir("./")        # 當前目錄
  • 取得當前目錄 - os.getcwd()
1
os.getcwd()
  • 檢查目錄是否存在 - os.path.isdir(目錄路徑)
1
2
3
4
5
6
# 檢查當前位置是否存在export目錄
testDir  = os.getcwd() + "\\export"
if os.path.isdir(testDir):
    print("exist")
else:
    print("not exist")
  • 檢查檔案是否存在 - os.path.isfile(檔案路徑)
1
2
3
4
5
6
# 檢查當前位置是否存在text.txt
testFile  = os.getcwd() + "\\test.txt"
if os.path.isfile(testFile):
    print("exist")
else:
    print("not exist")
  • 檢查路徑是否存在 - os.path.exists(目錄路徑)
1
2
3
4
5
testPath  = "\\etc\\hosts"
if os.path.exists(testPath):
    print("exist")
else:
    print("not exist")
  • 於指定路徑建立目錄 - os.mkdir(路徑+目錄名)
1
2
3
4
# 檢查當前目錄是否存在export目錄,沒有則建立
new_dir  = os.getcwd() + "\\export"
if os.path.isdir(new_dir) != True:
    os.mkdir(new_dir)

影像處理模組 - PIL(Pillow)

  • 安裝 PIL 模組
1
2
### 使用 pip 安裝 PIL 模組
pip install PIL
  • 載入模組
1
from PIL import Image
  • 打開圖檔 - .open(圖檔路徑)
1
im = Image.open("test.jpg")
  • 存檔 - .save("檔名", “[格式]”, [quality = 壓縮值(通常設定80或90)], [subsampling = 0])
1
2
3
4
5
im = Image.open("test.jpg")     # 打開圖檔
im.save("test1.png")            # 轉存成png

# 轉存成png並壓縮品質:80
im.save("test2.png", quality = 80, subsampling = 0)

PIL常用的圖檔格式

格式
BMPEPSGIFJPEGJPGPNGTIFFPDF
  • 調整圖片尺寸 - .resize((, ) [, filter(濾波)設定])

不會自動等比例縮放,需等比例縮放得自行計算比例。

1
2
3
4
5
6
im = Image.open("test.jpg")        # 載入圖片
width = 400                        # 指定寬度為 400px
ratio = float(width)/im.size[0]    # 計算長寬比
height = int(im.size[1]*ratio)     # 高度依長寬比計算並調整
nim = im.resize((width, height), Image.BILINEAR)
nim.save("test_resized.jpg")       # 另存調整尺寸後的圖檔

濾波設定值

filter(濾波)說明
NEAREST預設濾波,從輸入的圖檔中選取最近的像素作為輸出像素。
BILINEAR雙線性內插濾波,再輸入圖像的 2*2 矩陣上進行線性插值。
BICUBIC雙立方濾波,再輸入圖像的 4*4 矩陣上進行立方插值。
ANTIALIAS平滑濾波,對所有可以影響輸出像素的輸入像素進行高質量的重採樣濾波,以計算輸出像素值。

圖像繪製工具 - turtle

1
2
3
4
5
6
7
8
9
import turtle           # 匯入圖像繪製工具turtle
turtle.showturtle()     # 打開turtle
turtle.forward(100)     # turtle往前100
turtle.left(90)         # 左轉90度
turtle.circle(30)       # 畫半徑30的圓
turtle.reset()          # 重新設定
turtle.goto(30,50)      # 移動到指定座標
turtle.penup()          # 將筆提起
turtle.pendown()        # 將筆放下

數字模組 - math

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import math
print(math.pi)          # 取圓周率
>>> 3.141592653589793
print(math.radians(45)) # 取弧度45度
>>> 0.7853981633974483
print(math.sin(math.radians(45))) # 取sin(45度)
>>> 0.7071067811865476
print(math.factorial(5)) # 取階乘(5為1*2*3*4*5)
>>> 120
print(math.gcd(27, 9))   # 取最大公因數
>>> 9

亂數模組 - random

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import random

random.random()         # 取0~1的隨機數
>>> 0.5672829418362756

random.randint(1, 10)   # 取1~10的隨機數
>>> 4

K = [2,6,9,8,14,20,30]  # 先設定一個陣列
random.shuffle(K)       # 打亂陣列排列(直接操作該陣列)
print(K)
>>> [30, 9, 2, 6, 14, 20, 8]

浮點數精度模組 - Decimal

1
2
3
4
5
6
7
print(0.1+0.1+0.1)
>>> 0.30000000000000004

# 使用Decimal模組來避免浮點數精度問題
from decimal import Decimal
print(Decimal("0.1")*3)
>>> 0.3

抓DOS模式後方參數的模組 - sys

1
2
3
# sysArgv.py
import sys
print(sys.argv)
1
2
3
# 於DOS模式執行sysArgv.py並於後方帶參數A、B、C
python sysArgv.py A B C
>>> ['sysArgv.py', 'A', 'B', 'C']

資料庫模組 - sqlite3

  • 載入模組
1
import sqlite3
  • 連接資料庫 - .connect()
資料庫連結.connect(資料庫名稱)
1
2
import sqlite3
conn = sqlite3.connect("test.sqlite")
  • Cursor指標指到資料庫(以便使用資料庫物件操作資料庫) - .cursor()
資料庫物件 = 資料庫連結.cursor()
1
2
3
import sqlite3
conn = sqlite3.connect("test.sqlite")
cursor = conn.cursor()
  • 執行SQL語法 - .execute()
資料庫物件.execute(SQL語法)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import sqlite3
conn = sqlite3.connect("test.sqlite")
cursor = conn.cursor()

SQL = "CREATE TABLE IF NOT EXISTS UserScore('Name' Text, 'Score' Integer)"
cursor.execute(SQL)

# 使用變數
name = 'Wayne'
Score = 80
SQL = f"INSERT INTO UserScore VALUES('{name}', {Score})"
cursor.execute(SQL)
  • 提交當前的SQL事務(執行完SQL需使用此函式提交) - .commit()
資料庫連結.commit()
1
2
conn.commit()
conn.close()
  • 取得所有資料 - .fetchall()
資料庫物件.fetchall()
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import sqlite3
conn = sqlite3.connect("test042601.sqlite3")
cursor = conn.cursor()

SQL = 'SELECT * FROM UserData;'
cursor.execute(SQL)
rows = cursor.fetchall()
for row in rows:
    # format格式化資料型態
    print("{}\t{}\t{}".format(row[0], row[1], row[2]))
  • 取得單筆資料 - .fetchone()
資料庫物件.fetchone()
1
2
3
4
5
6
7
8
9
import sqlite3
conn = sqlite3.connect("test042601.sqlite3")
cursor = conn.cursor()

SQL = 'SELECT * FROM UserData;'
cursor.execute(SQL)
line = cursor.fetchone()
if not line == None:
    print("{}\t{}\t{}".format(line[0], line[1], line[2]))

正規表達式模組 - re

以小寫r開頭再接字串,例如:r"\d"r"0-9"
規則寫法說明範例
{}個數\d{4}-\d{6}:台灣電話號碼格式0000-000000為符合
{n,}至少出現n次X{2,}:X至少出現2次才符合
``
\d任意數字\d:0-9為符合
-1-5:1 ~ 5為符合,a-z:a ~ z為符合
^否定^aeiou:非a,e,i,o,u為符合
.字元.:字元皆符合,符號類(例如:\n)不符合
*重複前一個字元0~無限多次都符合err*:err、errr、errrr…等都為符合
?前一個字元可有可無皆符合colou?r:color、colour皆為符合
+前一個字元要一次以上才符合er+:er不符合,err、errr…等才符合
$1.位數由後往前匹配 2.為結尾才匹配[1-9]\d$:1 ~ 99皆為符合,100不符合
()1.僅收集括號內的內容 2.分組別以便.group(組別)可以直接抓到值r'<h3 class="LC20lb DKV0Md">(.*?)</h3>':僅回傳<h3>內的文字
\b邊界,為邊界則符合dog\b:‘dog ‘符合,‘dog’不符合
\數字分組向前參考
  • 貪婪/逐步量詞 (*/?)
貪婪量詞 - *:0次~無限次皆符合。
1
2
3
re.match(r"<.*>", "<h3>大家好</h3>")

>>> <h3>大家好</h3>
逐步量詞 - ?:回傳最短的量詞。
1
2
3
re.match(r"<.*?>", "<h3>大家好</h3>")

>>> <h3>
  • 載入模組
1
import re
  • 分割字串 - re.split(正則, 分割的字串)
1
2
3
print(re.split('\d', "Andy1Ben2Cathy"))

>>> ['Andy', 'Ben', 'Cathy']
  • 取代字元 - re.sub(正則, 欲取代的字元, 字串)
1
2
3
re.sub("\d", "-", "Andy1Ben2Cathy")

>>> 'Andy-Ben-Cathy'
  • 匹配字元 - re.match(欲匹配的文字, 字串)
1
2
3
re.match("yahoo", "yahoo.com.tw")

>>> <re.Match object; span=(0, 5), match='yahoo'>
  • 尋找字元(找第一個) - re.search(欲尋找的文字, 字串)
1
2
3
re.search("yahoo", "yahoo.com.tw")

>>> <re.Match object; span=(0, 5), match='yahoo'>
  • 尋找字元(找所有) - re.findall(欲尋找的文字, 字串)
1
2
3
re.findall('\d{4}-\d{6}', "jjladpoiwlkj 0800-123456 hjkpojas 0921-456873")

>>> ['0800-123456', '0921-456873']

抓html模組 - requests

  • 載入模組
1
import requests
GET
  • 抓取檔案 - .get(網址)
1
response = requests.get("https://www.baidu.com/")
GET 可帶的參數(需使用關鍵字參數)說明
headers請求的headers
params參數
cookiesclient的cookies
  • 抓取標頭(head) - .head(網址)
1
2
# .head() -> 只抓標頭
reshead = requests.head("https://www.baidu.com/")
  • 狀態碼 - status_code
1
2
3
print(response.status_code)

>>> 200 # 200為正常連線
  • 編碼格式 - encoding
1
2
3
4
5
print(response.encoding)
>>> 'ISO-8859-1'

# 轉編碼為utf-8
response.encoding = "utf-8"
  • html內容 - text
1
2
3
print(response.text)

>>> '<!DOCTYPE html>\r\n<!--STATUS OK--><html>...'
  • response headers - headers
1
2
3
print(response.headers)

>>> {'Server': 'Baby Web Server', 'Content-Type': 'text/html', 'Content-Length': '467', 'Set-Cookie': 'SESSIONID=00000006; path=/;version=1', 'Date': 'Sun, 03 May 2020 10:41:58 GMT'}
  • request headers - request.headers
其中的User-Agent相當重要,用來判斷使用者的相關資訊用,爬蟲與反爬蟲通常使用此參數。
1
2
3
print(response.request.headers)

>>> {'User-Agent': 'python-requests/2.22.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
  • 抓圖片檔
開檔格式使用wb:二進位格式寫入
w:寫入 / b:二進位格式
1
2
3
4
5
6
7
8
import requests

res = requests.get("https://www.natgeomedia.com/userfiles/PhotoContest/771/sm1100/2019091450912553.jpg")
photo = res.content

# w:寫入/b:二進位格式 "wb" => 二進位格式寫入
with open("img01.jpg", "wb") as file:
    file.write(photo)
  • 帶request header的請求
先從一般瀏覽器取得header(user-agent)
需使用關鍵字參數
1
2
3
4
5
# 從瀏覽器的開發者工具取得正常的request headers資料
headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36"}

# 在後方帶入關鍵字參數headers
res = requests.get("http://google.com.tw", headers = headers)
POST
POST 可帶的參數(需使用關鍵字參數)說明
dataform data請求的data
headers請求的headers
cookiesclient的cookies
  • POST存Session - .Session()
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
data = {
    "from": "/bbs/Gossiping/index.html",
    "yes": "yes"
    }

headers = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36"
    }

# 先使用POST取得滿18歲的驗證並存放置session內
rs = requests.Session()
rs.post("https://www.ptt.cc/ask/over18", data = data, headers = headers)

# 過滿18歲的驗證後使用get取得網頁內容
response = rs.get("https://www.ptt.cc/bbs/Gossiping/index.html", headers = headers)

解析&美化HTML模組 - BeautifulSoup4

  • 載入模組
1
from bs4 import BeautifulSoup
  • BeautifulSoup4的基本元素表
基本元素說明
tag標籤:最基本的信息組織單位,分別用<></>標明開頭與結尾。
name標籤名稱:<p>...</p>的名字是p,格式:<tag>.name
Attributes屬性:<tag>.attrs,dict型式。
NavigatString內容:<tag>.string
Comment註釋:標籤內字符串的註釋部分,一種特殊的Comment類型。
  • 解析 - .BeautifulSoup(html, ‘html.parser’)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
demo = """
<html><head><title>This is a python demo page</title></head>
<body>
<p class="title"><b>The demo python introduces several python courses.</b></p>
<p class="course">Python is a wonderful general-purpose programming language. You can learn Python from novice to professional by tracking the following courses:
<a href="http://www.icourse163.org/course/BIT-268001" class="py1" id="link1">Basic Python</a> and <a href="http://www.icourse163.org/course/BIT-1001870001" class="py2" id="link2">Advanced Python</a>.</p>
</body></html>
"""

soup = BeautifulSoup(demo, 'html.parser')
  • 美化 - .prettify()
1
print(soup.prettify())
  • 取得屬性 - .attrs
1
2
3
4
5
print(soup.a.attrs)

>>> {'href': 'http://www.icourse163.org/course/BIT-268001',
 'class': ['py1'],
 'id': 'link1'}
  • 取得tag內容 - .string/.text
1
2
3
4
5
print(soup.a.string)
print(soup.a.text)

>>> 'Basic Python'
>>> 'Basic Python'
  • 找第一個標籤 - .find("標籤")
1
2
3
soup.find("a")

>>> <a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a>
  • 找全部的標籤 - .find_all("標籤", class_="className")
可加上class做篩選條件。
1
2
3
4
5
6
7
8
9
# 寫法1:
soup.find_all("p", class_="title")

>>> [<p class="title"><b>The demo python introduces several python courses.</b></p>]

# 寫法2:
soup.find_all("p", {"class"="title"})

>>> [<p class="title"><b>The demo python introduces several python courses.</b></p>]
  • 透過選擇器篩選標籤 - .select(同CSS選擇器,Class或ID)
若有空格會有問題,soup.select(."title p") 會報錯,空格需使用.find().findAll()
1
2
3
4
5
6
7
# 使用Class選擇器
print(soup.select(".title"))
>>> [<p class="title"><b>The demo python introduces several python courses.</b></p>]

# 使用ID選擇器
print(soup.select("#link1"))
>>> [<a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a>]

json模組

  • 載入模組
1
import json
  • json轉dict - json.loads("字串")
1
2
3
4
5
6
7
import json
txt = '{ "name": "John", "age": "28", "city": "Taiwan" }'
data = json.loads(txt)
print(type(data))

# 字典型態
>>> '<class 'dict'>'
  • dict轉json string - json.dumps("字典")
1
2
3
4
5
6
7
import json
txt = { "name": "John", "age": "28", "city": "Taiwan" }
jsonData = json.dumps(txt)
print(jsonData)

# 轉換後為json格式的字串
>>> {"name": "John", "age": "28", "city": "Taiwan"}

csv模組

  • 載入模組
1
import csv
  • _csv.reader型態讀取csv檔 - csv.reader(檔案)
1
2
3
4
5
6
import csv
with open('MI_5MINS_HIST.csv', encoding='big5') as file:
    rows = csv.reader(file)
    # 一筆一筆取出資料
    for row in rows:
        print(row)
  • dict型態讀取csv檔 - csv.DictReader(檔案)
1
2
3
4
5
6
import csv
with open('MI_5MINS_HIST.csv', encoding='big5') as file:
    rows = csv.DictReader(file)
    # 一筆一筆取出資料
    for row in rows:
        print(row)
  • 寫入csv檔 - csv.writer(檔案變數)
需先定義一個物件為csv.writer(),在進行寫入。
writerow() :單行寫入
1
2
3
4
5
6
with open('Temp.csv', 'w') as csvfile:
    writer = csv.writer(csvfile)

    writer.writerow(['姓名', '身高', '體重'])
    writer.writerow(['Jessica', 158, 45])
    writer.writerow(['Wayne', 172, 60])
  • 字典型態寫入csv檔 - csv.DictWriter(檔案變數, fieldnames=欄位變數(列表型態))
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
with open('DictTemp.csv', 'w', encoding='big5') as csvfile:
    
    # 設定欄位變數
    rowNames = ['姓名', '身高', '體重']
    
    # fieldnames = 指定欄位
    writer = csv.DictWriter(csvfile, fieldnames=rowNames)
    
    # 寫入欄位名稱
    writer.writeheader()
    
    #寫入資料
    writer.writerow({'姓名': 'Jessica', '身高': 156, '體重': 45})
    writer.writerow({'姓名': 'Wayne', '身高': 172, '體重': 60})

模擬瀏覽器模組(自動化測試) - selenium

  • 安裝 selenium 模組
Anaconda編譯器的話,使用Anaconda Prompt
1
2
### anaconda 安裝 selenium 模組
conda install selenium
1
2
### 使用 pip 安裝 selenium 模組
pip install selenium
  • 下載瀏覽器驅動(web driver)
    先查看chrome瀏覽器的版本,Google:Web driver chrome後下載。

  • 載入模組

1
from selenium import webdriver
  • 實例化一個瀏覽器視窗(Chrome),並設定一個瀏覽器物件
檔案名稱勿與selenium模組名稱相同以免衝突而無法執行
1
2
3
from selenium import webdriver

driver = webdriver.Chrome()
  • 發送GET請求 - 瀏覽器物件.get(網址)
1
driver.get("http://www.baidu.com")
  • 根據dom元件的id/class定位 - 瀏覽器物件.find_element_by_id(id) 或 瀏覽器物件.find_element_by_class(class)
1
2
# 找到id為"kw"的input,並輸入"python"
driver.find_element_by_id("kw").send_keys("python")
  • 送出表單 - 瀏覽器物件.dom元件.submit()
1
2
# 送出id為"su"的表單
driver.find_element_by_id("su").submit()
  • 點擊事件 - 瀏覽器物件.dom元件.click()
1
2
# 送出id為"btn"的按鈕
driver.find_element_by_id("btn").click()
  • 取得頁面原始碼 - .page_source
1
SourceHtml = driver.page_source
  • 螢幕截圖 - 瀏覽器物件.save_screenshot(截圖的圖檔名稱)
1
driver.save_screenshot("screen.png")
  • 獲取cookies - 瀏覽器物件.get_cookie()
1
2
cookies = driver.get_cookie()
print(cookies)
  • 關閉實例化的瀏覽器視窗 - 瀏覽器物件.close()瀏覽器物件.quit()
1
2
driver.close()
# 或 driver.quit()

資料分析模組 - Pandas

  • 載入模組
1
import pandas
  • 解析list類型 - pandas物件.Series(資料)
1
2
3
4
5
6
7
8
9
import pandas
data = [20, 10, 15]
pds = pandas.Series(data)
print(pds)

>>> 0    20
>>> 1    10
>>> 2    15
>>> dtype: int64
  • 解析Data類型 - pandas物件.DataFrame(字典型態的資料)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
data = pandas.DataFrame({
    "name": ["Amy", "Jack", "Cathy"],
    "salary": [1000, 5000, 2000]
})
print(data)

>>>     name  salary
>>> 0    Amy    1000
>>> 1   Jack    5000
>>> 2  Cathy    2000

# 取特定欄位
print(data[salary])

>>> 0    1000
>>> 1    5000
>>> 2    2000
可指定x軸或y軸欄位名稱(columns, index)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import pandas
data = [
    [65,92,78,83,70],
    [62,96,81,63,71],
    [45,58,30,53,75],
    [90,91,70,90,100],
]

index = ["張三", "李四", "王五", "趙雲"]
columns = ["國文", "數學", "英文", "自然", "社會"]
df = pandas.DataFrame(data, columns = columns, index = index)

print(df)

>>>     國文  數學  英文  自然   社會
>>> 張三  65   92   78   83    70
>>> 李四  62   96   81   63    71
>>> 王五  45   58   30   53    75
>>> 趙雲  90   91   70   90   100
  • 回傳最大值 - Data資料.max()
1
2
3
4
5
data = [20, 10, 15]
pds = pandas.Series(data)
print(pds.max())

>>> 20
  • 回傳最小值 - 資料.min()
1
2
3
4
5
data = [20, 10, 15]
pds = pandas.Series(data)
print(pds.min())

>>> 10
  • 取得指定欄位 - Data資料.loc[x][y]
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
data = pandas.DataFrame({
    "name": ["Amy", "Jack", "Cathy"],
    "salary": [1000, 5000, 2000]
})
print(data)
print(data.loc[0][1])

>>>     name  salary
>>> 0    Amy    1000
>>> 1   Jack    5000
>>> 2  Cathy    2000

>>> 1000
  • 輸出成csv(或json)檔案 - Data資料.to_csv("檔名", encoding="編碼")Data資料.to_json("檔名", encoding="編碼")
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import pandas
data = [
    [65,92,78,83,70],
    [62,96,81,63,71],
    [45,58,30,53,75],
    [90,91,70,90,100]
]
index = ["張三", "李四", "王五", "趙雲"]
columns = ["國文", "數學", "英文", "自然", "社會"]
df = pandas.DataFrame(data, columns = columns, index = index)
df.to_csv('temp.csv', encoding="utf-8-sig")

繪圖模組 - plot

  • 載入模組
1
import matplotlib.pyplot as plt
  • 畫折線圖 - .plot(X軸資料, Y軸資料)
1
2
3
4
5
6
7
import matplotlib.pyplot as plt

x1 = [1,4,7,9,13,16]
y1 = [15,50,80,40,70,50]

# 畫出折線圖
plt.plot(x1, y1)
  • 顯示Label - .legend()
要顯示label需執行此function
:為點線, --為虛線, 不指定預設為實線
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import matplotlib.pyplot as plt

x1 = [1,4,7,9,13,16]
y1 = [15,50,80,40,70,50]

# :為點線, --為虛線, 不指定預設為實線
plt.plot(x1, y1, label="food", color="red", linestyle=":")

#要顯示label - 需執行legend()
plt.legend()
  • 指定圖表標題 - .title()
1
plt.title("學生成績")
  • 指定X/Y軸標題 - .xlabel(X軸標題) / .ylabel(Y軸標題)
1
2
plt.xlabel("X軸標題")
plt.ylabel("Y軸標題")
  • 畫長條圖 - .bar(X軸資料, Y軸資料)
1
2
3
4
5
6
7
import matplotlib.pyplot as plt

x1 = [1,4,7,9,13,16]
y1 = [15,50,80,40,70,50]

# 畫出長條圖
plt.bar(x1, y1)
  • 畫圓餅圖 - .pie(資料)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import matplotlib.pyplot as plt
datas = [5,10,20,15]

# 畫出圓餅圖
plt.pie(datas)

# 讓特定區塊凸出(需與資料數量相同)
explode = [0,0,0.05,0]
plt.pie(datas, explode = explode)

# 指定每個區塊的標題
labels = ["東部","南部","西部","北部"]
plt.pie(sizes, labels = labels)

# 顯示百分比
plt.pie(sizes,autopct="%3.1f%%")

繪圖模組2 - plotly

  • 安裝 plotly 模組
Anaconda編譯器的話,需使用Anaconda Prompt安裝。
使用Jupyter Notebook編輯
1
2
### anaconda 安裝 plotly 模組
conda install plotly
  • 載入模組(並指定繪圖模式)
1
2
3
4
import plotly

# 指定繪圖模式:Scatter, Bar, Pie, Box, Scattergeo, Histogram
from plotly.graph_objs import Scatter # 折線散點圖
  • 在線繪圖需收費,需使用離線繪圖
1
plotly.offline.init_notebook_mode(connected=True)
  • 指定X/Y軸資料
1
data = [Scatter(x=["林大名", "陳聰明", "黃美麗"], y=[67,89,72])]
  • 畫出折線圖
1
2
data = [Scatter(x=["林大名", "陳聰明", "黃美麗"], y=[67,89,72])]
plotly.offline.iplot({"data":data})
  • 指定繪圖的mode
1
2
3
# markers:只有點 / lines:只有線 / lines + markers:點 + 線
data = [Scatter(x=["林大名", "陳聰明", "黃美麗"], y=[67,89,72], mode="markers")]
plotly.offline.iplot({"data":data})
  • 指定圖表標題(繪圖模式須import Layout)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import plotly
from plotly.graph_objs import Scatter, Layout

# 離線繪圖模式  

plotly.offline.init_notebook_mode(connected=True)

data = [Scatter(x=["林大名", "陳聰明", "黃美麗"], y=[67,89,72])]

# 指定圖表標題  

plotly.offline.iplot({"data":data, "layout":Layout(title="成績單")})

Excel模組 - openpyxl

  • 載入模組
1
import openpyxl
  • 建立工作簿物件 - openpyxl.Workbook()
1
2
# 工作簿物件
workbook = openpyxl.Workbook()
  • 取得指定工作表
1
2
# 工作表物件
sheet = workbook.worksheets[0]
  • 鍵入值
方法一:行列插入
1
2
3
# sheet:工作表物件
sheet['A1'] = "欄位一"
sheet['B1'] = "欄位二"
方法二:自動換行插入
1
2
3
# sheet:工作表物件
listTitle = ["姓名", "電話"]
sheet.append(listTitle)
  • 取得特定欄位的值 - .value
1
sheet['A1'].value
  • 存檔 - 工作簿物件.save(檔名)
1
workbook.save('test.xlsx')
  • 取檔 - openpyxl.load_workbook(檔名)
1
workbook = openpyxl.load_workbook('test.xlsx')
  • 取得總行數 - 工作表物件.max_row
1
print(sheet.max_row)
  • 取得總列數 - 工作表物件.max_column
1
print(sheet.max_column)
  • 到指定欄位 - 工作表物件.cell(row=指定行數, column=指定列數)
1
2
# 印出第3行第2列的值
print(sheet.cell(row=3, column=2).value)

Python 資料型態

資料型態說明

資料型態說明
str字串
int整數
bool布林值
float浮點數
None空值
list []列表,同Array
tuple ()不可變更的Array
dict {}字典,同Object
set ()集合,同Object,但key為索引值

Python 運算子

基本運算子

運算子說明
+加:數值相加,字串相連接
-
*乘:數值相乘,字串可乘數值(python獨有)
/浮點數除
**平方
**0.5開根號
//整數除
%取餘數

指派運算子

運算子說明
+=原值等於原值加
-=原值等於原值減
*=原值等於原值乘
/=原值等於原值除

判斷運算子

運算子說明
>大於
<小於
==等於
!=不等於
>=大於等於
<=小於等於

邏輯運算子

運算子說明
and並且
or或者
not反向

Python 函式

回傳資料型態 - type()

1
2
3
4
5
6
7
8
type(3)
>>> <class 'int'>
type('a')
>>> <class 'str'>
type(True)
>>> <class 'bool'>
type(None)    # Python的空值為None
>>> <class 'NoneType'>

輸入窗 - input()

1
2
3
4
myName = input("請輸入姓名:")
>>> 請輸入姓名jessica    # 輸入名字後
print(myName)             # 取輸入的名字
>>> jessica

字串轉數值 - eval()

1
2
3
num = eval("3")
print(type(num))
>>> <class 'int'>

特殊符號轉十進位編號 - ord() / chr()

1
2
3
4
5
6
7
# ord 將特殊符號轉換成十進位編號
ord('⤅')
>>> 10501

# chr 將十進位編號轉換成特殊符號
chr(10501)
>>> 

取最大 / 最小值 - max() / min()

1
2
3
4
min(1, 2, 45, 100)
>>> 1
max(1, 2, 45, 100)
>>> 100

取絕對數值 - abs()

1
2
abs(-3.14)
>>> 3.14

進制字串轉數字 - eval()

1
2
eval("0o101")
>>> 65

數字轉字串 - str()

1
2
str(324)
>>> '324'

字串轉數字或數字轉整數 - int()

1
2
3
4
int("324")
>>> 324
int(3.14)
>>> 3

浮點數字串轉數字 - float()

1
2
float("3.1416")
>>> 3.1416

四捨五入 - round(數值 [,位數])

1
2
3
4
5
6
round(3.1416)
>>> 3

# 第二個參數可帶位數
round(3.1416, 3)
>>> 3.142

平方 - pow(數值, 平方根)

1
2
3
# 第二個參數為平方根
pow(5, 2)
>>> 25

取得長度 - len()

任何資料型態都通用
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# String
strA = "Hello World"
len(strA)
>>> 11

# Array
arrA = [1, 2, 20, 50, 100]
len(arrA)
>>> 5

# Object
objA = {"itemA":"123", "itemB":"456"}
len(objA)
>>> 2

編碼 / 解碼 - encode() / decode()

1
2
3
4
5
"中".encode("utf-8")
>>> b'\xe4\xb8\xad'

b'\xe4\xb8\xad'.decode("utf-8")
>>> "中"

字串轉大小寫 - upper() / lower()

1
2
3
4
5
6
7
StrA = "Hello World!"
# 大寫
StrA.upper()
>>> 'HELLO WORLD!'
# 小寫
StrA.lower()
>>> 'hello world!'

字串取代 - replace(舊字串, 新字串)

1
2
3
StrA = "Hello World!"
StrA.replace("World", "Jessica")
>>> 'Hello Jessica!'

字串判斷的函式

函式說明
StrA.isalpha()是否為字母
StrA.isdigit()是否為數字
StrA.isupper()是否為大寫
StrA.islower()是否為小寫
StrA.isidentifer()是否為識別字
StrA.iskeyword()是否為關鍵字,需要keyword模組
StrA.isspace()是否為空白
StrA.istitle()是否為標題字(第一個字為大寫則是標題字)

字串搜尋的函式

函式說明
Str.count(文字A)搜尋文字A出現的次數
StrA.startswith(文字A)是否為文字A開頭
StrA.endswith(文字A)是否為文字A結尾
StrA.find(文字A)搜尋文字A的位置
StrA.rfind(文字A)搜尋文字A最後出現的位置

印出字串 - print()

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 一般的print(間隔預設自動補空格)
print(1, 2, 3)
>>> 1 2 3

# 間隔不空格
print(1, 2, 3, sep="")
>>> 123

# 指定間隔文字
print(1, 2, 3, sep="@")
>>> 1@2@3

# 指定結尾文字
print(1, 2, 3, sep="@", end="!!!")
>>> 1@2@3!!!

# 格數化輸出字元(開頭帶一個小寫的"f")
print(f'{變數A}*{變數B}={變數A*變數B}')
>>> A * B = AB

字串格式化 - format()

取代字串中{}
1
2
3
text = 'world'
print('hello {}'.format(text))
>>> hello world
可帶關鍵字取代
1
2
3
4
5
name = 'Jack'
text = 'world'

print('hello {name}, hello {text}'.format(name=name, text=text))
>>> hello Jack, hello world

從最後面插入 - append()

1
2
3
4
list1 = [2,4,6,8]
list1.append(10)

>>> [2,4,6,8,10]

從指定位置插入 - insert(位置, )

1
2
3
4
list1 = [2,4,6,8,10]
list1.insert(0, -1)

>>> [-1,2,4,6,8,10]

條件判斷

條件判斷式 - if… elif… else…

1
2
3
4
5
6
7
# 使用縮排撰寫要做的事
if 條件A:
    ...
elif 條件B:
    ...
else:
    ...

例外判斷 - try… except…

1
2
3
4
5
6
7
8
try:
    # ...
except Exception:
    print("有異常錯誤")
except NameError:
    print("變數有錯誤")
except TypeError:
    print("資料格式錯誤")
  • except 錯誤分類
錯誤異常判斷說明
Exception只要有錯誤
NameError變數名稱錯誤
ValueErrorvalue值錯誤
ZeroDivisionError除數/分母不可為零的錯誤
TypeError資料格式錯誤

迴圈

技術式迴圈 - for

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 跑range
for i in range(1, 6):
    print(i, end=" ")
>>> 1 2 3 4 5

# 跑在字串
for c in "Mary":
    print(c, end=" ")
>>> "M" "a" "r" "y"

# 跑在陣列
for e in ["a", 3, "Jessica"]
>>> "a"
>>> 3
>>> "Jessica"

條件式迴圈 - while

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# while迴圈
i = 0
while i < 5:
    i += 1
    print(i)

>>> 1
>>> 2
>>> 3
>>> 4
>>> 5

# While判斷(反覆驗證直到ans等於"happy")
ans = input("請輸入快樂的英文:")
while ans != "happy":
    ans = input("拼錯囉,再給你一次機會:")
else:
    print("答對囉,是happy")
break:跳脫迴圈
1
2
3
4
5
6
7
8
9
ans = input("請輸入快樂的英文:")
while ans.lower() != "happy":
    # 當輸入quit時跳出迴圈
    if(ans.lower() == "quit"):
        print("猜不出來了吧,結束")
        break;
    ans = input("拼錯囉,再給你一次機會:")
else:
    print("答對囉,是", ans)
continue:跳過繼續進行下一迴圈
1
2
3
4
5
6
7
8
# i遇4的因數就跳過
i = 0
while i <= 100:
    i += 1
    # continue前要先加1,避免進入無窮迴圈
    if i % 4 == 0:
        continue
    print(i, end=" ")

自訂函式

自定義函式 - def

  • 一般宣告函式
1
2
3
4
5
6
7
def printStar(_n):
    return "*" * _n


# 執行函式
print(printStar(6))
>>> ******
  • 設定參數預設值
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
def TeaTime(desserts, drink="咖啡"):
    print(f'下午茶點心為{desserts},飲料為{drink}')


TeaTime('馬卡龍', '紅茶')    # 指定實際參數
TeaTime('馬卡龍')    # 飲料會顯示預設值:咖啡
TeaTime()    # 兩個參數都顯示預設值

>>> 下午茶點心為馬卡龍,飲料為紅茶
>>> 下午茶點心為馬卡龍,飲料為咖啡
>>> 下午茶點心為鬆餅,飲料為咖啡
  • 設定不定個數參數(參數為tuple型態)
帶入參數帶星號可將帶入的參數組成一個tuple
1
2
3
4
5
6
7
8
9
def add(*numbers):
    total = 0
    for i in numbers:
        total += i
    print(total)

add(1, 2, 4, 6)

>>> 13
實際參數帶星號可將原為tuple型態的資料拆解開來
1
2
3
4
5
6
7
8
9
def add(*numbers):
    total = 0
    for i in numbers:
        total += i
    print(total)
    
add(*range(0, 11))

>>> 55
  • 多個回傳值
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 回傳值用逗號隔開
def divmod(x, y):
    div = x // y
    mod = x % y
    return div, mod

# 用{a,b}接多個回傳值
a, b = divmod(100, 7)

print(f'100除以7的商數為{a},餘數為{b}')

>>> 100除以7的商數為14,餘數為2

操作 List(列表)

建立

  • 建立空list
1
2
3
4
5
# 方法1:
list1 = []

# 方法2:
list2 = list()
  • 建立list
1
list1 = [1, "taipei", 2, "tokyo"]    # 每個的資料型態不限
  • 從string建立list
1
list1 = list("Hello")    # list1為 ["H","e","l","l","o"]
  • 從range建立list
1
list1 = list(5)    # list1為 [0,1,2,3,4]
  • 從字串分割建立list
1
list1 = "1 2 3".split()    # list1為 ["1","2","3"]

刪除

  • 刪除整個list
1
del list1
  • 刪除list中的某一個(以第一個為例)
1
2
3
4
5
6
7
8
# 方法1
del list1[0]

# 方法2
list.remove(0)

# 方法3
list.pop([0])
  • 清除list元素(等於del list[::])
1
2
3
4
list1 = [2,4,6,8,10]
list1.clear()

>>> []

list新增元素

1
2
3
list.append(x)    # 附加元素到最後
list.extend(L)
list.inser(i, x)    # 插入元素至指定位置

查詢索引

1
list1.index('a')    # 查詢a在list1的索引

統計出現的次數

1
list1.count('a')    # 統計a在list1中出現的次數

元素排序

1
list.sort()    # 原地操作

元素倒序

1
list1.reverse()    # 原地操作

操作 Dict(字典)

查詢

  • 一般查詢
1
dict1[key]    # 若key值不在會報錯
  • 以key查詢,使用dict1.get(key, [default]) - (推薦)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 若無key值則顯示default
dict1.get(key, [default])

#example:
fruits = {"apple":"30元", "banana":"10元"}
Quest = input("請輸入要查詢的價格的水果:")

print(fruits.get(Quest, "查無此水果"))

<<< apple
>>> 30
<<< orange
>>> 查無此水果
  • 查詢所有的key (回傳列表)
1
2
3
4
dict1 = {"user1":"小丸子", "user2":"小玉", "user3":"花輪"}
dict1.keys()

>>> dict_keys(['user1', 'user2', 'user3'])
  • 查詢所有的values (回傳列表)
1
2
3
4
dict1 = {"user1":"小丸子", "user2":"小玉", "user3":"花輪"}
dict1.values()

>>> dict_values(['小丸子', '小玉', '花輪'])

建立

  • 建立空dict
1
2
3
4
5
# 方法1:
dict1 = {}

# 方法2:
dict2 = dict()
  • 建立dict
1
dict1 = {1:"one", 2:"tow", 3:"three"}
  • 新增dict
1
dict1[newKey] = value

更新

  • 更新dict
1
dict1[oldKey] = value
  • 比對更新 - update
update 會比對沒有的key並補上,比對有的key進行value更新。
1
2
3
4
5
6
dict1 = {'user1': '小丸子', 'user2': '小玉', 'user3': '花輪'}
dict2 = {'user1': '大丸子', 'user2': '小玉', 'user3': '花輪', 'user4': '多拉A夢'}

dict1.update(dict2)

>>> {'user1': '大丸子', 'user2': '小玉', 'user3': '花輪', 'user4': '多拉A夢'}

刪除

  • 刪除整個dict
1
del dict1
  • 清空整個dict
1
dict1.clear()
  • 刪除list中的某一個(以第一個為例)
1
del dict1[key]

操作 class (類別/物件導向)

封裝成一個類別 - class 類別名稱:

python的class會自動執行__init__函式,可自行定義__init__內要做的事。
__init__第一個參數預設為self
1
2
3
4
5
6
7
class GoogleSpyder:
    def __init__(self, keyword):
        self.keyword = keyword
        self.url_tmp = "http://google.com/search?q=" + keyword + "&start={}"
        self.headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36"}
    
googleSpyder = GoogleSpyder("python") # 自動執行 __init__

檔案處理

讀寫模式

模式說明
rread:讀取(檔案需存在)
wwrite:新建檔案寫入(檔案可不存在,若存在則清空)
aappend:資料附加到舊檔案後面(游標指在檔案結尾,檔案可不存在)
r+讀取舊資料並寫入(檔案需存在且游標指在開頭)
w+清空檔案內容,新寫入的東西可再讀出
a+資料附加到舊檔案後面,可讀取資料
b二進位模式
記憶方式:
1
2
3
4
ww+    # 會清除原檔案內容
rr+    # 檔案指標指向檔案開頭
aa+    # 檔案指標指向檔案結尾
+        # 可讀可寫模式

檔案開啟 - open()

  • 操作後需關檔 - close()
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
content = """Hello Python
中文測試
abc
123456.321654987
$@^$%^@#$!@#$
"""

file = open("myfile.txt", "w")
...
file.close()

讀取 - read()

myfile.txt
1
testtest123
test.py
1
2
3
file = open(r"myfile.txt", "r")
print(file.read())
file.close()
執行回傳
1
>>> testtest123

寫入 - write()

test.py
1
2
3
file = open(r"myfile.txt", "w")
file.write('testtest123')
file.close()
myfile.txt
1
testtest123

移動讀寫頭 - seek()

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
content = """Hello Python"""

file = open(r"myfile.txt", "r")
# file.write(content)
file_content = file.read()
print(file_content)

file.seek(0)    # 移動讀寫頭到開頭

file_content = file.read()
print(file_content)
file.close()
執行回傳
1
2
>>> Hello Python
>>> Hello Python

讀出行數 - readline() & readlines()

  • readline:一行一行讀
  • readlines:一次讀全部行數
poem.txt
1
2
3
4
松下問童子
言師採藥去
只在此山中
雲深不知處
read.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# readlines() 一次讀出
f = open(r'poem.txt', 'r')
lines = f.readlines()
for line in lines:
    print(line, end='')


f.seek(0)    # 讀寫頭回到開頭

# readline() 一行一行讀
line = f.readline()

while line != '':
    print(line, end='')
    line = f.readline()
    
f.close()
執行回傳:
1
2
3
4
>>> 松下問童子
>>> 言師採藥去
>>> 只在此山中
>>> 雲深不知處

使用 with-open-as 做讀檔案的動作 - (推薦)

1
2
with open(r"poem.txt", "r") as file:
    print(file.read())
執行回傳:
1
2
3
4
>>> 松下問童子
>>> 言師採藥去
>>> 只在此山中
>>> 雲深不知處

刪除檔案 - remove()

  • 使用os模組
  • 使用os.path.exists判斷檔案是否存在
1
2
3
4
5
6
7
8
import os

file = r"poem2.txt"

if os.path.exists(file):
    os.remove(file)
else:
    print('No exists file')

新增目錄 - mkdir()

  • 使用os.path.exists判斷檔案是否存在
1
2
3
4
5
6
7
8
import os

dir = "testDir"

if os.path.exists(dir):
    print("Direct is exists")
else:
    os.mkdir(dir)

刪除空目錄 - rmdir()

  • 使用os.path.exists判斷檔案是否存在
  • 限定空目錄
1
2
3
4
5
6
7
8
import os

dir = "testDir"

if os.path.exists(dir):
    os.rmdir(dir)
else:
    print("Direct is undefine")

刪除目錄與底下全部檔案 - rmtree()

  • 使用shell utility模組 - shutil
  • 需謹慎使用避免刪錯目錄
1
2
3
import shutil

shutil.rmtree("testDir")

Python 語法筆記

兩個變數交換值(Python Only)

1
2
3
4
x = 3
y = 8
x,y = y,x    # 交換兩個變數的值
print(x,y)

開頭宣告編碼方式可直接強轉(Python Only)

1
2
3
4
# -*- coding: utf-8 -*-
# 轉utf-8
print("哈囉")
>>> "哈囉"

Python函數帶入參數方式

  • 參數以tuple傳入function。
1
2
3
4
5
6
def func1(*args):
    print(args)

func2(1,3,5,7,9)

>>> (1, 3, 5, 7, 9)
  • 參數以tuple拆解,進function在組合回tuple
1
2
3
4
5
6
def func2(*args):
    print(args)

func2(*(2,4,6,8,10))

>>> (1, 3, 5, 7, 9)
  • 參數以dict傳入function。
1
2
3
4
5
6
def func3(**kwargs):
    print(kwargs)

func3(even=(2,4,6,8), odd=(1,3,5,7,9))

>>> {'even': (2, 4, 6, 8), 'odd': (1, 3, 5, 7, 9)}
  • 參數以dict拆解,進function在組合回dict(需為參數指定關鍵字)(關鍵字參數)
1
2
3
4
5
6
def func4(**kwargs):
    print(kwargs)

func4(**{"even":(2,4,6,8), "odd":(1,3,5,7,9)})

>>> {'even': (2, 4, 6, 8), 'odd': (1, 3, 5, 7, 9)}

其他

字串運算(Python Only)

  • in:是否含有
1
2
3
# in
"or" in "forever"
>>> True
  • not in:是否不含有
1
2
3
# not in
"abc" not in "forever"
>>> False
  • 取字串的特定位置字元
格式:開始點:結束點:間隔
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 取第1~4個字元(不含第4個)
"abcdefg"[1:4]
>>> 'bcde'

# 取第1~4個字元(每次間隔2個)
"abcdefg"[1:4:2]
>>> 'bd'

# 取最後一個字元
"abcdefg"[-1]
>>> 'g'

# 反轉
"abcdefg"[::-1]
>>> 'gfedcba'

SQLite 關聯式資料庫(版本3.31.1)

系統命令(.開頭),SQL命令(;結尾)

系統命令

進入資料庫

指令:sqlite3 資料庫名稱
1
2
3
sqlite3 test01.sqlite

sqlite>

資料庫 (DB)

sqlite指令新增資料庫

1
.open test01

sqlite指令查詢所有資料庫

1
.databases

資料表 (Table)

欄位設定說明
NM(None)可否允許空值
PK(Primary Key)是否為主鍵
AI(A.I)是否自動產生值
U(Unique)不重複鍵

新增資料表

1
create table studen(ID Integer, name String, score Integer);

sqlite指令查詢所有資料表

1
.table

更新資料表

SQL語法:ALTER TABLE 資料庫 ADD COLUMN 欄位名稱 資料型態

1
ALTER TABLE student ADD COLUMN address String;

資料操作 (CRUD:Create/Read/Update/Delete)

插入資料

SQL語法:INSERT INTO 資料表 VALUES(欄位1, 欄位2, 欄位3)

1
INSERT INTO student values(1001, "Ben", 88);

查詢資料

SQL語法:SELECT 欄位 FROM 資料表 [WHERE 條件];

1
SELECT Score from student WHERE ID = 1001;

刪除資料

SQL語法:DELETE FROM 資料表 [WHERE 條件];

1
DELETE from student WHERE ID = 1001;

修改資料

SQL語法:UPDATE 資料表 SET 欄位名稱 = [WHERE 條件];

1
UPDATE student SET Name = "Amanda" WHERE ID = 1001;

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus