Python3 教學 #03 (Ch6~Ch8: Module、I/O)
本章會介紹Python的Module、I/O!
Module(模組): import 套件用法
I/O(輸入/輸出):包括open 開檔、read 讀檔、write 寫檔、印訊息 (print、repr、format)、codec 處理中文
也會特別介紹如何針對.JSON檔做中文字的讀取、寫入!
(以下語法皆以Python3.6撰寫。)
模組,讓你的Python程式可以重用!
同時也可以使用高手寫好的函式庫,讓你寫程式的過程中更省力!
前置作業
先使用Python編輯器編輯一個新的Python檔,並且定義兩個函數!
檔名:calc.py
函數名:add(), product()
1 2 3 4 5 |
def add(x): return x+2 def product(x): return x*2 |
匯入所有函數(一般用法)
假設我們需要使用calc.py的程式裡面的函數,就可以利用下列語法匯入『calc』模組!
匯入時不需要輸入副檔名,只需要將這兩隻程式放在同一層資料夾即可!
新增一個檔案『main.py』,如下:
1 2 |
import calc print("Product:", calc.product(5)) |
部分匯入
如果只需要匯入部分的函數,可以這樣用!
1 2 3 4 5 |
from calc import add, product # 因為只有匯入add和product兩個函數, # 所以在呼叫的時就可以直接呼叫『product』,而不需要加上前面的『calc.』 print("Add:", add(5)) print("Product:", product(5)) |
建置主程式(主程式的進入點)
寫這麼多程式,就是要讓電腦或伺服器能定期執行,
而這時候就會需要設定主程式的進入點!(程式被運行時會先被執行的地方)
直接在系統上執行python程式的方式如下:
Mac開啟終端機、Windows開啟命令提示字元
1 2 3 |
# python main.py <參數> # 以下列例子來說,50就是輸入main.py的參數 python main.py 50 |
主程式裡面則需要這樣寫:
其中『sys.argv[0]、sys.argv[1]』就是用來main.py的參數
sys.argv[0]:預留給本程式的檔名
sys.argv[1]~sys.argv[xx]:這才是輸入main.py的參數
1 2 3 4 5 6 7 |
# 讓Python知道,這邊就是程式的進入點 if __name__ == "__main__": import sys import calc print("argv[0]:", sys.argv[0] ) print("Product:", calc.product(int(sys.argv[1]))) print("Add:", calc.add(int(sys.argv[1]))) |
下列是執行、輸出的方式:
1 2 3 4 5 6 |
Last login: Tue Jan 16 20:56:10 on ttys002 Andy-MBP:~ Andy$ cd ~/Documents/Python/ch6 Andy-MBP:ch6 Andy$ python3.6 main.py 50 argv[0]: main.py Product: 100 Add: 52 |
在螢幕上輸出訊息
逗號『 , 』
用簡單的逗號就可以達成輸出文字與數字混合的訊息!
1 2 3 |
>>> age = 18 >>> print("I am", age, "years old.") I am 18 years old. |
類別repr(str).rjust(N)
字串自動填滿N位數,並向右對齊
1 2 3 4 5 6 7 8 9 10 11 |
>>> for i in range(1, 6): ... str = "" ... for j in range(1, 4): ... str += repr(j).rjust(2) + "x" + repr(i).rjust(2) + "=" + repr(i*j).rjust(2) + "\t" ... print(str) ... 1x 1= 1 2x 1= 2 3x 1= 3 1x 2= 2 2x 2= 4 3x 2= 6 1x 3= 3 2x 3= 6 3x 3= 9 1x 4= 4 2x 4= 8 3x 4=12 1x 5= 5 2x 5=10 3x 5=15 |
repr類別之下還有幾個也都蠻好用的方法!
repr(str).ljust(N):保留N字元,並且向左對齊
repr(str).center(N):保留N字元,並且左右對齊(置中)
字串的方法 str.format()
“字串{變數}”.format(對應變數)
變數格式的語法:{變數序號, 格式}
變數序號:如果你有好幾個不同的變數,就必須要從0開始往後編號
格式:預留字元數、變數型態(d:整數, f:浮點數 )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
>>> # 範例1 >>> for i in range(1, 6): ... print("{0:2d}: {1:3d}".format(i, i*i)) ... 1: 1 2: 4 3: 9 4: 16 5: 25 >>> # 範例2 >>> # 假設有2個不同的變數,1個整數整數<要預留3位數>,1個浮點數<要預留1位整數、5位小數> >>> import math >>> print("I'm {0:3d} years old. Pi is {1:6.5f}".format(18, math.pi)) I'm 18 years old. Pi is 3.14159 >>> # 範例3 >>> # 使用字典加上**與format搭配印出指定的資料 >>> dict = {"Andy": 100, "Betty": 60, "Cindy": 85, "Denny": 20, "Emily": 75} >>> print("Andy got {Andy:d} and Emily got {Emily:d}.".format(**dict)) Andy got 100 and Emily got 75. |
開檔/讀檔/寫檔
使用open()來開啟或讀取檔案
open(“檔名”, “方法”, encoding=”編碼”)
方法:r:僅讀取、w:完全取代原有內容、a:增加新的內容至文件尾端、r+:讀取加寫入
讀取檔案內容:file.read()
1 2 3 4 5 |
file = open("text", "r", encoding="utf8") # 直接使用file.read()讀取檔案內容! print(file.read()) # 讀取結束後,要記得把檔案關閉 file.close() file.close() |
另一種更安全的讀寫檔方法『with open() as file』
1 2 3 4 5 6 7 8 |
my_list = [] with open('text', 'r', encoding="utf8") as read_f: for row in read_f.readlines(): # strip("\n") 去除換行符號 my_list.append(row.strip('\n')) for data in my_list: print(data) |
寫檔像這樣就可以了
1 2 3 4 5 6 |
# 僅需要寫時用『w』 write_f = open('text', 'w', encoding="utf8") for i in range(5): # 用write(字串)來寫入檔 write_f.write("Python Writing:我是傳奇{0}.\n".format(i)) write_f.close() |
讀取JSON檔
先建立一個JSON檔吧!將下列JSON內容另存成『json.json』!
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[{"location":"桃園區","面積":34.8046,"下轄里數":76,"下轄鄰數":1725,"人口數":439643,"人口增減":"+467","人口密度":12632,"郵遞區號":330}, {"location":"中壢區","面積":76.5200,"下轄里數":85,"下轄鄰數":1943,"人口數":403915,"人口增減":"+597","人口密度":5279,"郵遞區號":320}, {"location":"大溪區","面積":105.1206,"下轄里數":27,"下轄鄰數":685,"人口數":94370,"人口增減":"+45","人口密度":898,"郵遞區號":335}, {"location":"楊梅區","面積":89.1229,"下轄里數":41,"下轄鄰數":972,"人口數":167075,"人口增減":"+282","人口密度":1875,"郵遞區號":326}, {"location":"蘆竹區","面積":75.5025,"下轄里數":37,"下轄鄰數":663,"人口數":161450,"人口增減":"+257","人口密度":2138,"郵遞區號":338}, {"location":"大園區","面積":87.3925,"下轄里數":18,"下轄鄰數":425,"人口數":88860,"人口增減":"+131","人口密度":1017,"郵遞區號":337}, {"location":"龜山區","面積":72.0177,"下轄里數":30,"下轄鄰數":804,"人口數":156971,"人口增減":"+335","人口密度":2180,"郵遞區號":333}, {"location":"八德區","面積":33.7111,"下轄里數":48,"下轄鄰數":1305,"人口數":197261,"人口增減":"+369","人口密度":5852,"郵遞區號":334}, {"location":"龍潭區","面積":75.2341,"下轄里數":30,"下轄鄰數":897,"人口數":121496,"人口增減":"+126","人口密度":1615,"郵遞區號":325}, {"location":"平鎮區","面積":47.7532,"下轄里數":46,"下轄鄰數":1497,"人口數":223754,"人口增減":"+254","人口密度":4686,"郵遞區號":324}, {"location":"新屋區","面積":85.0166,"下轄里數":23,"下轄鄰數":270,"人口數":48888,"人口增減":"+26","人口密度":575,"郵遞區號":327}, {"location":"觀音區","面積":87.9807,"下轄里數":24,"下轄鄰數":402,"人口數":66334,"人口增減":"+110","人口密度":754,"郵遞區號":328}, {"location":"復興區","面積":350.7775,"下轄里數":10,"下轄鄰數":125,"人口數":11453,"人口增減":"+13","人口密度":33,"郵遞區號":336}] |
讀取方法如下:
需要先匯入json模組,才能使用json.loads讀取
1 2 3 4 5 6 7 |
# 匯入json模組 import json file = open('json.json', 'r', encoding='utf8') # 讀取JSON檔的方法json.loads(file.read()) taoyuan = json.loads(file.read()) print(taoyuan[1]["location"], taoyuan[1]["面積"]) file.close() |
結果應該會印出:
1 |
中壢區 76.52 |
寫入JSON檔
本範例包含解決Python寫入中文字的問題!
為解決中文字寫入的問題,必須要先匯入codecs!
1 2 3 4 5 6 7 8 |
import codecs dict = {"台灣人口":23000000, "台灣地理位置": "東南亞"} # 開檔改成使用codecs! with codecs.open('my_writing_JSON', 'w', "utf8") as wf: # ensure_ascii一定要設定成False,否則無法正確寫入中文 str = json.dumps(dict, ensure_ascii=False) wf.write(str) |