SlideShare une entreprise Scribd logo
1  sur  40
Télécharger pour lire hors ligne
8. open() 與 io 模組
8. open() 與 io 模組
• 學習目標
– 使用 open()函式
– 使用 stdin、stdout、
stderr
– 認識檔案描述器
– 認識 io 模組
2
使用 open() 函式
• 在最基本的需求上,只需要使用到它的前
兩個參數:file 與 mode
3
read()、write()、close()
4
read() 方法
• 在未指定引數的情況下,會讀取檔案全部
的內容
在指定整數引數的情況下,會讀取指定的
字元數或位元組數(依開啟模式是文字或
者二進位而定)
5
• 檔案開啟模式與後續進行的操作必須符合,
否則引發 UnsupportedOperation 例外
• 可以使用 readable() 方法測試是否可讀
取,使用 writable() 方法測試可否寫入
6
readline()、readlines()、
writelines()
• 對於文字模式來說,預設是讀取到'n'、
'r'或'rn',都可以被判定為一行
• readline()或readlines()讀到的每一
行,換行字元都一律換為'n'。
• 對於二進位模式來說,行的判斷標準預設
是遇到b'n'這個bytes
• 文字模式在寫入的情況下, 任何'n'都
會被置換為os.linesep 的值(Windows
就是'rn')
7
8
• 逐行讀取檔案內容
9
• Python 的檔案讀取風格:讀取一個檔案最
好的方式,就是不要去 read!
10
• 在進行檔案讀寫時,tell() 方法可以告知
目前在檔案中的位移值,單位是位元組值,
檔案開頭的位移值是 0
• seek() 方法可以指定跳到哪個位移值
11
• 可以使用 seek() 來實現隨機存取
• 可以執行 flush() 方法,將緩衝內容出清
12
readinto()
13
• buffering 參數用來設置緩衝策略
• 預設的緩衝策略會試著自行決定緩衝大小
(通常會是 4096 或 8192 位元組)
• 或者對互動文字檔案採用行緩衝(line
buffering)
• 如果 buffering 設定為0,表示關閉緩衝
• 設定為大於0 的整數值,表示指定緩衝的位
元組大小
14
• encoding 指定文字模式時的檔案編碼
• 預設採用 locale.getpreferredencoding()
的傳回值作為編碼
• 如果文字檔案採用的編碼不同,讀取時就
有可能會出現亂碼問題
15
• 在正確指定 encoding 為 'UTF-8' 的情
況下,就不會有問題了:
16
• errors 參數可指定發生編碼錯誤時,該如
何進行處理
• 在不設定的情況下,發生編碼錯誤時會引
發 ValueError 的子類別例外
17
• newlines 的指定值還可以是''、'n'、
'r'與'rn'
• 如果指定了'',讀取到'n'、'r'或
'rn', 都可以被判定為一行, 而
readline()或readlines()讀到的每一
行,一律保留來源換行字元
• 如果設定為其他'n'、'r'或'rn',
那麼讀取後的換行字元就會是指定的字元
18
• 文字模式在寫入的預設情況下,任何'n'
都會被置換為os.linesep 的值
• 如果newline 設為''就保留原有的換行
字元,如果指定為其他值,就以指定的字
元進行置換
19
stdin、stdout、stderr
• 在 sys 模組中有個 stdin 就代表著標準輸
入,而 stdout 就代表著標準輸出
• 行為上就像 open() 函式開啟的文字模式
檔案物件
20
• 對於標準輸出或輸出, 若想二進位模式讀
取或寫入, 可使用sys.stdin.buffer
或sys.stdout.buffer
• 行為就像是以open()函式開啟的二進位模
式檔案物件
21
• 可以改變標準輸入或輸出的來源
22
• 將一個自行開啟的檔案物件,指定給
sys.stdout,就可以利用 print() 來寫
出資料至檔案
• 內建的 print() 函式本身,就有一個
file 參數可以達到這樣的需求
23
• 可以使用 >將程式執行時的標準輸出訊息,
導向至指定的檔案,或者使用 >> 附加訊息
• 標準錯誤的輸出不能使用 >或 >> 重新導向
至檔案
24
認識檔案描述器
• open() 函式的 file 參數,除了接受字串
指定檔案的路徑外,還可指定檔案描述器
• 檔案描述器會是個整數值,對應至目前程
式已開啟的檔案
• 標準輸入通常使用檔案描述器 0,標準輸出
是 1,標準錯誤是 2,進一步開啟的檔案則
會是 3、4、5 等數字
25
• 對於檔案物件,可以使用 fileno() 方法
來取得檔案描述器
26
• 如果指定 open() 的第一個參數為0 會如何
呢?
27
• 若能取得一個對應至系統上已開啟的檔案
描述器,就有機會使用 open() 來包裹成
為檔案物件,以利用檔案物件的高階行為
28
• open() 函式的 closed 參數預設值是
True
– 這表示若 open()時 file 指定了一個檔案
描述器,在檔案物件呼叫 close()方法而關
閉時,被指定的檔案描述器也會一併關閉
– 當指定為 False 時,就不會關閉被指定的檔
案描述器
29
• open() 還有個 opener 可以用來指定一
個函式,該函式必須有兩個參數
– 第一個參數會傳入 open() 函式被指定的檔
案路徑
– 第二個參數會是 open() 函式依 mode 而計
算出來的 flags 值,函式最後必須傳回一個
檔案描述器
–open() 函式基於該檔案描述器建立檔案物件,
以便進行檔案操作。
30
31
認識 io 模組
• open() 函式實際上是個工廠函式
• 若想進一步掌握檔案物件的操作,就得認
識 io 模組
32
• 檔案物件大致上分為三個主要類型
– 文字(Text)I/O
– 二進位(Binary)I/O
– 原始(Raw)I/O
33
34
35
• 原始 I/O 是無緩衝低階操作,少直接使用,
常作為文字 I/O 或二進位 I/O 底層操作
36
• TextIOWrapper 也是個包裹器,可以包
裹 BufferedIOBase,以便將二進位資料
依指定的文字編碼進行轉換
37
• 如果資料的讀取來源或寫入目的地,並不
是個檔案,而想要是記憶體中某個物件,
那麼可以使用 BytesIO 或 StringIO
38
• 通常使用 BytesIO 時,最後會使用
getvalue() 方法來取得寫入的資料
39
• 若想讀寫的是文字資料,可以使用 StringIO
40

Contenu connexe

Plus de Justin Lin

Ch14 簡介 Spring Boot
Ch14 簡介 Spring BootCh14 簡介 Spring Boot
Ch14 簡介 Spring BootJustin Lin
 
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityJustin Lin
 
Ch12 Spring 起步走
Ch12 Spring 起步走Ch12 Spring 起步走
Ch12 Spring 起步走Justin Lin
 
Ch11 簡介 JavaMail
Ch11 簡介 JavaMailCh11 簡介 JavaMail
Ch11 簡介 JavaMailJustin Lin
 
Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Justin Lin
 
Ch09 整合資料庫
Ch09 整合資料庫Ch09 整合資料庫
Ch09 整合資料庫Justin Lin
 
Ch08 自訂標籤
Ch08 自訂標籤Ch08 自訂標籤
Ch08 自訂標籤Justin Lin
 
Ch07 使用 JSTL
Ch07 使用 JSTLCh07 使用 JSTL
Ch07 使用 JSTLJustin Lin
 
Ch06 使用 JSP
Ch06 使用 JSPCh06 使用 JSP
Ch06 使用 JSPJustin Lin
 
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Justin Lin
 
Ch04 會話管理
Ch04 會話管理Ch04 會話管理
Ch04 會話管理Justin Lin
 
Ch03 請求與回應
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應Justin Lin
 
Ch02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletCh02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletJustin Lin
 
CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式Justin Lin
 
14. 進階主題
14. 進階主題14. 進階主題
14. 進階主題Justin Lin
 
13.並行、平行與非同步
13.並行、平行與非同步13.並行、平行與非同步
13.並行、平行與非同步Justin Lin
 
12. 除錯、測試與效能
12. 除錯、測試與效能12. 除錯、測試與效能
12. 除錯、測試與效能Justin Lin
 
11. 常用內建模組
11. 常用內建模組11. 常用內建模組
11. 常用內建模組Justin Lin
 
10. 資料永續與交換
10. 資料永續與交換10. 資料永續與交換
10. 資料永續與交換Justin Lin
 
9. 資料結構
9. 資料結構9. 資料結構
9. 資料結構Justin Lin
 

Plus de Justin Lin (20)

Ch14 簡介 Spring Boot
Ch14 簡介 Spring BootCh14 簡介 Spring Boot
Ch14 簡介 Spring Boot
 
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/Security
 
Ch12 Spring 起步走
Ch12 Spring 起步走Ch12 Spring 起步走
Ch12 Spring 起步走
 
Ch11 簡介 JavaMail
Ch11 簡介 JavaMailCh11 簡介 JavaMail
Ch11 簡介 JavaMail
 
Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Ch10 Web 容器安全管理
Ch10 Web 容器安全管理
 
Ch09 整合資料庫
Ch09 整合資料庫Ch09 整合資料庫
Ch09 整合資料庫
 
Ch08 自訂標籤
Ch08 自訂標籤Ch08 自訂標籤
Ch08 自訂標籤
 
Ch07 使用 JSTL
Ch07 使用 JSTLCh07 使用 JSTL
Ch07 使用 JSTL
 
Ch06 使用 JSP
Ch06 使用 JSPCh06 使用 JSP
Ch06 使用 JSP
 
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器
 
Ch04 會話管理
Ch04 會話管理Ch04 會話管理
Ch04 會話管理
 
Ch03 請求與回應
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應
 
Ch02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletCh02 撰寫與設定 Servlet
Ch02 撰寫與設定 Servlet
 
CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式
 
14. 進階主題
14. 進階主題14. 進階主題
14. 進階主題
 
13.並行、平行與非同步
13.並行、平行與非同步13.並行、平行與非同步
13.並行、平行與非同步
 
12. 除錯、測試與效能
12. 除錯、測試與效能12. 除錯、測試與效能
12. 除錯、測試與效能
 
11. 常用內建模組
11. 常用內建模組11. 常用內建模組
11. 常用內建模組
 
10. 資料永續與交換
10. 資料永續與交換10. 資料永續與交換
10. 資料永續與交換
 
9. 資料結構
9. 資料結構9. 資料結構
9. 資料結構
 

Dernier

函數畫圖_習題7.pptx 函數畫圖_習題7.pptx 函數畫圖_習題7.pptx
函數畫圖_習題7.pptx 函數畫圖_習題7.pptx 函數畫圖_習題7.pptx函數畫圖_習題7.pptx 函數畫圖_習題7.pptx 函數畫圖_習題7.pptx
函數畫圖_習題7.pptx 函數畫圖_習題7.pptx 函數畫圖_習題7.pptxNCU MCL
 
20161220 - domain-driven design
20161220 - domain-driven design20161220 - domain-driven design
20161220 - domain-driven designJamie (Taka) Wang
 
SymPy 在微積分上的應用_4.pptx SymPy 在微積分上的應用_4.pptx
SymPy 在微積分上的應用_4.pptx SymPy 在微積分上的應用_4.pptxSymPy 在微積分上的應用_4.pptx SymPy 在微積分上的應用_4.pptx
SymPy 在微積分上的應用_4.pptx SymPy 在微積分上的應用_4.pptxNCU MCL
 
20211119 - demystified artificial intelligence with NLP
20211119 - demystified artificial intelligence with NLP20211119 - demystified artificial intelligence with NLP
20211119 - demystified artificial intelligence with NLPJamie (Taka) Wang
 
20170104 - transaction_pattern
20170104 - transaction_pattern20170104 - transaction_pattern
20170104 - transaction_patternJamie (Taka) Wang
 
买假和真英国驾驶执照买了假的英国驾照,那跟真的有什么区别吗?买假和真正的澳大利亚驾驶执照【微信qoqoqdqd】
买假和真英国驾驶执照买了假的英国驾照,那跟真的有什么区别吗?买假和真正的澳大利亚驾驶执照【微信qoqoqdqd】买假和真英国驾驶执照买了假的英国驾照,那跟真的有什么区别吗?买假和真正的澳大利亚驾驶执照【微信qoqoqdqd】
买假和真英国驾驶执照买了假的英国驾照,那跟真的有什么区别吗?买假和真正的澳大利亚驾驶执照【微信qoqoqdqd】黑客 接单【TG/微信qoqoqdqd】
 
函數微分_習題4.pptx 函數微分_習題4.pptx 函數微分_習題4.pptx
函數微分_習題4.pptx 函數微分_習題4.pptx 函數微分_習題4.pptx函數微分_習題4.pptx 函數微分_習題4.pptx 函數微分_習題4.pptx
函數微分_習題4.pptx 函數微分_習題4.pptx 函數微分_習題4.pptxNCU MCL
 
SymPy 在微積分上的應用_5.pptx SymPy 在微積分上的應用_5.pptx
SymPy 在微積分上的應用_5.pptx SymPy 在微積分上的應用_5.pptxSymPy 在微積分上的應用_5.pptx SymPy 在微積分上的應用_5.pptx
SymPy 在微積分上的應用_5.pptx SymPy 在微積分上的應用_5.pptxNCU MCL
 
函數畫圖_習題6.pptx 函數畫圖_習題6.pptx 函數畫圖_習題6.pptx
函數畫圖_習題6.pptx 函數畫圖_習題6.pptx 函數畫圖_習題6.pptx函數畫圖_習題6.pptx 函數畫圖_習題6.pptx 函數畫圖_習題6.pptx
函數畫圖_習題6.pptx 函數畫圖_習題6.pptx 函數畫圖_習題6.pptxNCU MCL
 
函數畫圖_習題5.pptx 函數畫圖_習題5.pptx 函數畫圖_習題5.pptx
函數畫圖_習題5.pptx 函數畫圖_習題5.pptx 函數畫圖_習題5.pptx函數畫圖_習題5.pptx 函數畫圖_習題5.pptx 函數畫圖_習題5.pptx
函數畫圖_習題5.pptx 函數畫圖_習題5.pptx 函數畫圖_習題5.pptxNCU MCL
 

Dernier (15)

函數畫圖_習題7.pptx 函數畫圖_習題7.pptx 函數畫圖_習題7.pptx
函數畫圖_習題7.pptx 函數畫圖_習題7.pptx 函數畫圖_習題7.pptx函數畫圖_習題7.pptx 函數畫圖_習題7.pptx 函數畫圖_習題7.pptx
函數畫圖_習題7.pptx 函數畫圖_習題7.pptx 函數畫圖_習題7.pptx
 
20161220 - domain-driven design
20161220 - domain-driven design20161220 - domain-driven design
20161220 - domain-driven design
 
SymPy 在微積分上的應用_4.pptx SymPy 在微積分上的應用_4.pptx
SymPy 在微積分上的應用_4.pptx SymPy 在微積分上的應用_4.pptxSymPy 在微積分上的應用_4.pptx SymPy 在微積分上的應用_4.pptx
SymPy 在微積分上的應用_4.pptx SymPy 在微積分上的應用_4.pptx
 
20151111 - IoT Sync Up
20151111 - IoT Sync Up20151111 - IoT Sync Up
20151111 - IoT Sync Up
 
Entities in DCPS (DDS)
Entities in DCPS (DDS)Entities in DCPS (DDS)
Entities in DCPS (DDS)
 
20161027 - edge part2
20161027 - edge part220161027 - edge part2
20161027 - edge part2
 
20211119 - demystified artificial intelligence with NLP
20211119 - demystified artificial intelligence with NLP20211119 - demystified artificial intelligence with NLP
20211119 - demystified artificial intelligence with NLP
 
20170104 - transaction_pattern
20170104 - transaction_pattern20170104 - transaction_pattern
20170104 - transaction_pattern
 
20200226 - AI Overview
20200226 - AI Overview20200226 - AI Overview
20200226 - AI Overview
 
买假和真英国驾驶执照买了假的英国驾照,那跟真的有什么区别吗?买假和真正的澳大利亚驾驶执照【微信qoqoqdqd】
买假和真英国驾驶执照买了假的英国驾照,那跟真的有什么区别吗?买假和真正的澳大利亚驾驶执照【微信qoqoqdqd】买假和真英国驾驶执照买了假的英国驾照,那跟真的有什么区别吗?买假和真正的澳大利亚驾驶执照【微信qoqoqdqd】
买假和真英国驾驶执照买了假的英国驾照,那跟真的有什么区别吗?买假和真正的澳大利亚驾驶执照【微信qoqoqdqd】
 
函數微分_習題4.pptx 函數微分_習題4.pptx 函數微分_習題4.pptx
函數微分_習題4.pptx 函數微分_習題4.pptx 函數微分_習題4.pptx函數微分_習題4.pptx 函數微分_習題4.pptx 函數微分_習題4.pptx
函數微分_習題4.pptx 函數微分_習題4.pptx 函數微分_習題4.pptx
 
SymPy 在微積分上的應用_5.pptx SymPy 在微積分上的應用_5.pptx
SymPy 在微積分上的應用_5.pptx SymPy 在微積分上的應用_5.pptxSymPy 在微積分上的應用_5.pptx SymPy 在微積分上的應用_5.pptx
SymPy 在微積分上的應用_5.pptx SymPy 在微積分上的應用_5.pptx
 
函數畫圖_習題6.pptx 函數畫圖_習題6.pptx 函數畫圖_習題6.pptx
函數畫圖_習題6.pptx 函數畫圖_習題6.pptx 函數畫圖_習題6.pptx函數畫圖_習題6.pptx 函數畫圖_習題6.pptx 函數畫圖_習題6.pptx
函數畫圖_習題6.pptx 函數畫圖_習題6.pptx 函數畫圖_習題6.pptx
 
函數畫圖_習題5.pptx 函數畫圖_習題5.pptx 函數畫圖_習題5.pptx
函數畫圖_習題5.pptx 函數畫圖_習題5.pptx 函數畫圖_習題5.pptx函數畫圖_習題5.pptx 函數畫圖_習題5.pptx 函數畫圖_習題5.pptx
函數畫圖_習題5.pptx 函數畫圖_習題5.pptx 函數畫圖_習題5.pptx
 
20200323 - AI Intro
20200323 - AI Intro20200323 - AI Intro
20200323 - AI Intro
 

8. open() 與 io 模組