Python程式設計
Lesson 11: 資料夾與檔案
讀取檔案
- 認識編碼格式
- 開啟檔案: open()
- 讀取檔案內容
- 讀取整個檔案: read()
- 逐行讀取: readlines()
- 搜尋: find()
認識編碼格式

abc123
ANSI編碼
ASCII編碼
Windows 1252
中文字
萬國碼(utf-8)
(中文三碼,英文一碼)
大五碼(big5)
Windows 950
(中文兩碼,英文一碼)
使用encoding參數設定編碼
fn = 'test1.txt' # 假設檔案為UTF-8編碼 with open(fn, encoding='UTF-8') as file_Obj: obj_list = file_Obj.readlines() # 每次讀一行 ... ... fn2 = 'test2.txt' # 假設檔案為Big5編碼 with open(fn, encoding='cp950') as file_Obj: obj_list = file_Obj.readlines() # 每次讀一行 ... ...
fn = 'test1.txt' # 假設檔案為UTF-8編碼 with open(fn, encoding='UTF-8') as file_Obj: obj_list = file_Obj.readlines() # 每次讀一行 ... ... fn2 = 'test2.txt' # 假設檔案為Big5編碼 with open(fn, encoding='cp950') as file_Obj: obj_list = file_Obj.readlines() # 每次讀一行 ... ...
呼叫open()函式時,指定encoding參數
讀取檔案前,要先呼叫open()開啟檔案
fname = "test.txt" fobj = open(fname, mode="r") print(fobj)
呼叫open()成功後,得到「檔案」物件
D:\Python
<_io.TextIOWrapper name='test.txt' mode='r' encoding='cp950'>
輸出結果
cp950是預設的編碼格式
open()開啟檔案時,必須設定讀寫模式
若不指定,則為預設模式:mode="r"
mode參數
r | w | a | r+ | w+ | a+ |
---|---|---|---|---|---|
讀取 | 寫入 (覆寫) |
寫入 (附加) |
讀寫 | 讀寫+創建 (覆寫) |
讀寫+創建 (附加) |
fn = 'test.txt' # 設定欲開啟的檔案, 請先新增此一檔案 file_Obj = open(fn) # 用預設mode=r開啟檔案,傳回檔案物件file_Obj f1 = open('檔案1.txt', mode='a') f2 = open('檔案2.txt', encoding='utf-8') f3 = open('檔案3.txt', mode='r+') # 開啟檔案3, 讀寫皆可, 檔案必須存在 f4 = open('檔案4.txt', mode='a+') # 開啟檔案4, 讀寫, 檔案不存在則新建
讀取檔案內容的函式之一:檔案物件.read()
fn = 'test.txt' # 設定欲開啟的檔案, 請先新增此一檔案 file_Obj = open(fn) # 用預設mode=r開啟檔案,傳回檔案物件file_Obj data = file_Obj.read() # 讀取檔案到變數data file_Obj.close() # 關閉檔案物件 print(data) # 輸出變數data相當於輸出檔案
fn = 'test.txt' # 設定欲開啟的檔案, 請先新增此一檔案 file_Obj = open(fn) # 用預設mode=r開啟檔案,傳回檔案物件file_Obj data = file_Obj.read() # 讀取檔案到變數data file_Obj.close() # 關閉檔案物件 print(data) # 輸出變數data相當於輸出檔案
檔案物件.read() 回傳檔案全部內容
讀取完畢後,呼叫「檔案物件.close()」關閉檔案
fn = 'test.txt' # 設定欲開啟的檔案, 請先新增此一檔案 with open(fn) as fobj: # 預設讀取模式mode=r,傳回檔案物件file_Obj data = fobj.read() # 讀取檔案到變數data print(data) # 輸出變數data相當於輸出檔案
with open(要開啟的檔案) as 檔案物件:
處理檔案內容的指令區塊
with關鍵字搭配open(), 讓檔案讀取區塊化
使用字串處理函式rstrip(),去除檔案末端的空白行
fn = 'test.txt' # 設定欲開啟的檔案, 請先新增此一檔案 with open(fn) as file_Obj: # 預設mode=r開啟檔案,傳回檔案物件file_Obj data = file_Obj.read() # 讀取檔案到變數data print(data.rstrip()) # 輸出變數data相當於輸出檔案,同時刪除末端字元
檔案有時會有多餘的空格,rstrip()可去除空格
fn = 'test.txt' # 設定欲開啟的檔案, 請先新增此一檔案 with open(fn) as fobj: num = 0 # num 記錄行號 for line in fobj: # for 迴圈, 逐行檢視檔案內容 num += 1 # 行數多1 print('第%d行: %s' % (num , line.rstrip())) # 去除空格/換行字元
若要逐行讀取,可在for迴圈使用「檔案物件」
第1行: 一直以來,Google 的 Android 系統是基於 Linux 系統進行開發的。
第2行: 但是到現在,不僅僅是 Google,華為、Samsung
第3行: 等手機廠商已經將系統進行了非常大的系統底層修改,
第4行: 以適應智能手機的需求
輸出結果
類似以「檔案物件」置於for迴圈的作用
fn = 'MackayDemo.txt' with open(fn, encoding='utf-8') as fobj: # 開啟檔案。編碼也可能是cp950 obj_list = fobj.readlines() # 讀取多行 for index, line in enumerate(obj_list): print(index+1, line.rstrip()) # 列印串列
fn = 'MackayDemo.txt' with open(fn, encoding='utf-8') as fobj: # 開啟檔案。編碼也可能是cp950 obj_list = fobj.readlines() # 讀取多行 for index, line in enumerate(obj_list): print(index+1, line.rstrip()) # 列印串列
fn = 'MackayDemo.txt' with open(fn, encoding='utf-8') as fobj: # 開啟檔案。編碼也可能是cp950 obj_list = fobj.readlines() # 讀取多行 for index, line in enumerate(obj_list): print(index+1, line.rstrip()) # 列印串列
讀取檔案內容的函式之二:檔案物件.readlines()
檔案物件.readlines() 取得內容,為「串列」形式
使用enumerate(),可取得串列索引值
串列可搭配enumerate() 取得索引值
檔案物件.readlines() 取得內容,為「串列」形式
for index, line in enumerate(obj_list):
print(index+1, line.rstrip()) # 列印串列
列舉函式,產生0開始的編號

fn = 'test.txt' # 設定欲開啟的檔案 with open(fn) as file_Obj: # 開啟檔案,傳回檔案物件file_Obj obj_list = file_Obj.readlines() # 讀取全部 str_Obj = '' # 先設為空字串 for line in obj_list: # 將各行字串存入 str_Obj += line.rstrip() print(str_Obj) # 列印檔案字串
練習2.1: 將檔案各行合併為一行
fn = 'test.txt' # 設定欲開啟的檔案 with open(fn) as file_Obj: # 傳回檔案物件file_Obj data = file_Obj.read() # 讀取檔案到變數data new_data = data.replace('滬尾', '淡水') # 新變數儲存 print(new_data.rstrip()) # 輸出檔案
練習2.2: 將檔案某些字串置換
字串內容置換方式:字串物件.replace(舊字串, 新字串)
fn = 'test.txt' # 設定欲開啟的檔案 with open(fn) as file_Obj: # 用預設mode=r開啟檔案,傳回檔案物件file_Obj obj_list = file_Obj.readlines() # 每次讀一行 str_Obj = '' # 先設為空字串 for line in obj_list: # 將各行字串存入 str_Obj += line.rstrip() findstr = input("請輸入欲搜尋字串 = ") index = str_Obj.find(findstr) # 搜尋findstr字串是否存在 if index >= 0: # 搜尋檔案是否有欲尋找字串 print("搜尋 %s 字串存在 %s 檔案中" % (findstr, fn)) print("在索引 %s 位置出現" % index) else: print("搜尋 %s 字串不存在 %s 檔案中" % (findstr, fn))
❸ 使用字串物件.find(),搜尋內容
index = 字串.find(搜尋的字串)
index: 回傳字串所在的索引值 或 -1(找不到)
檔案處理功能之三: 字串物件.find()搜尋內容
fn = 'test.txt' # 1. 開啟檔案 with open(fn, mode="r", encoding="utf-8") as fobj: data = fobj.readlines() # 2.讀取資料 fobj.close() # 3. 關閉檔案 # 前處理: 合併字串 fstr = '' # 合併後的單一字串 for line in data: fstr += line.strip() # 串接, 去除空白字元 while True: mystr = input('輸入查詢字串,直接按Enter結束程式:') if mystr.strip() == '': break index = fstr.find(mystr) # 搜尋 if index<0: # 找不到 print(f'搜尋{mystr} 字串不存在檔案 {fn}中') else: # 找到 print(f'搜尋{mystr}字串出現在位置{index}的地方') print('程式結束')
使用字串物件.find(),搜尋內容--while迴圈版
fn = 'test.txt' # 設定欲開啟的檔案 with open(fn) as file_Obj: # 開啟檔案,傳回檔案物件file_Obj obj_list = file_Obj.readlines() # 每次讀一行 str_Obj = '' # 先設為空字串 for line in obj_list: # 將各行字串存入 str_Obj += line.rstrip() findstr = input("請輸入欲搜尋字串 = ") if findstr in str_Obj: # 搜尋檔案是否有欲尋找字串 print("搜尋 %s 字串存在 %s 檔案中" % (findstr, fn)) else: print("搜尋 %s 字串不存在 %s 檔案中" % (findstr, fn))
練習:使用字串的in運算子,搜尋內容
練習3.1: 搜尋字串內容
寫入檔案
- 寫入函式: write()
將內容寫入檔案的函式之一:write()
# 寫入檔案, 編碼格式為utf-8 # 開始模式 'a+': 內容會附加在檔後;檔案若不在,則會新建 fname = 'output.txt' text = '這是要寫入的內容' with open(fname, 'a+', encoding='utf-8') as fobj: fobj.write(text) fobj.close()
# 寫入檔案, 編碼格式為utf-8 # 開始模式 'a+': 內容會附加在檔後;檔案若不在,則會新建 fname = 'output.txt' text = '這是要寫入的內容' with open(fname, 'a+', encoding='utf-8') as fobj: fobj.write(text) fobj.close()
write()只能寫入字串,無法直接寫入數值

# 開啟檔案output.txt # 模式'r+': 可讀可寫, 檔案不存在則出現錯誤 fname = 'output.txt' value = 101 # 某個整數 with open(fname, 'r+', encoding='utf-8') as fobj: fobj.write(value) fobj.close()
# 開啟檔案output.txt # 模式'r+': 可讀可寫, 檔案不存在則出現錯誤 fname = 'output.txt' value = 101 # 某個整數 with open(fname, 'r+', encoding='utf-8') as fobj: fobj.write(value) fobj.close()
... value = 101 # 某個整數 with open(fname, 'r+', encoding='utf-8') as fobj: fobj.write(str(value)) ....
... value = 101 # 某個整數 with open(fname, 'r+', encoding='utf-8') as fobj: fobj.write(str(value)) ....
練習4.1: 從鍵盤輸入文字後,寫入某檔案
# 開啟檔案, 模式'a+', 編碼 utf-8 fname = 'output2.txt' with open(fname, 'a+', encoding='utf-8') as fobj: while True: line = input('輸入內容(直接按enter結束):') if line == '': # 未輸入內容,直接按Enter break # 跳出迴圈 else: fobj.write(line) # 寫入內容 fobj.close() # 關閉檔案
write()寫入內容時,不會自動換行
write()不會自動換行,需自行加上'\n'換行字元
# 開啟檔案output.txt # 模式'a+': 附加內容於檔案後,檔案不在則會新建 fname = 'output.txt' str1 = '附加的內容' with open(fname, 'a+', encoding='utf-8') as fobj: for i in range(5): # 加入五行內容 fobj.write(str(i) +str1 + '\n') fobj.close()
# 開啟檔案output.txt # 模式'a+': 附加內容於檔案後,檔案不在則會新建 fname = 'output.txt' str1 = '附加的內容' with open(fname, 'a+', encoding='utf-8') as fobj: for i in range(5): # 加入五行內容 fobj.write(str(i) +str1 + '\n') fobj.close()
# 開啟檔案, 模式'a+', 編碼 utf-8 fname = 'output2.txt' with open(fname, 'a+', encoding='utf-8') as fobj: while True: line = input('輸入內容(直接按enter結束):') if line == '': # 未輸入內容,直接按Enter break # 跳出迴圈 else: fobj.write(line + '\n') # 寫入內容 fobj.close() # 關閉檔案
# 開啟檔案, 模式'a+', 編碼 utf-8 fname = 'output2.txt' with open(fname, 'a+', encoding='utf-8') as fobj: while True: line = input('輸入內容(直接按enter結束):') if line == '': # 未輸入內容,直接按Enter break # 跳出迴圈 else: fobj.write(line + '\n') # 寫入內容 fobj.close() # 關閉檔案
# 開啟檔案, 模式'a+', 編碼 utf-8 fname = 'output2.txt' with open(fname, 'a+', encoding='utf-8') as fobj: while True: line = input('輸入內容(直接按enter結束):') if line == '': # 未輸入內容,直接按Enter break # 跳出迴圈 else: fobj.write(line + '\n') # 寫入內容 fobj.close() # 關閉檔案
fn1 = 'input4.txt' # 輸入檔 fn2 = 'output5.txt' # 輸出檔 def read_file(fn, 編碼='cp950'): '''讀取fn的檔案內容, 回傳字串串列''' with open(fn, encoding=編碼) as fobj: # 1. 開檔 data = fobj.readlines() # 2. 讀取檔案內容 fobj.close() # 3. 關檔 return data # 回傳字串串列 def append_file(fn, data, 編碼='cp950'): '''寫出串列資料data到fn''' with open(fn, mode="a", encoding=編碼) as fobj: for line in data: fobj.write(line) fobj.close() # 主程式 檔案內容 = read_file(fn1, "cp950") append_file(fn2, 檔案內容, "utf-8")
fn1 = 'input4.txt' # 輸入檔 fn2 = 'output5.txt' # 輸出檔 def read_file(fn, 編碼='cp950'): '''讀取fn的檔案內容, 回傳字串串列''' with open(fn, encoding=編碼) as fobj: # 1. 開檔 data = fobj.readlines() # 2. 讀取檔案內容 fobj.close() # 3. 關檔 return data # 回傳字串串列 def append_file(fn, data, 編碼='cp950'): '''寫出串列資料data到fn''' with open(fn, mode="a", encoding=編碼) as fobj: for line in data: fobj.write(line) fobj.close() # 主程式 檔案內容 = read_file(fn1, "cp950") append_file(fn2, 檔案內容, "utf-8")
fn1 = 'input4.txt' # 輸入檔 fn2 = 'output5.txt' # 輸出檔 def read_file(fn, 編碼='cp950'): '''讀取fn的檔案內容, 回傳字串串列''' with open(fn, encoding=編碼) as fobj: # 1. 開檔 data = fobj.readlines() # 2. 讀取檔案內容 fobj.close() # 3. 關檔 return data # 回傳字串串列 def append_file(fn, data, 編碼='cp950'): '''寫出串列資料data到fn''' with open(fn, mode="a", encoding=編碼) as fobj: for line in data: fobj.write(line) fobj.close() # 主程式 檔案內容 = read_file(fn1, "cp950") append_file(fn2, 檔案內容, "utf-8")
讀寫範例
讀取CSV檔

文字檔案格式;csv指「逗號分格值」
可用MS Excel等試算表程式開啟
編號,船名,英文名,詞頻,起,訖,分類,航線,噸,Owner,
python提供csv模組,可用來存取csv檔
import csv
cf = open('example.csv') # 呼叫open()
使用csv模組,先匯入csv
import csv
匯入csv後,以open()開啟,取得csv檔案物件
import csv
with open('example.csv') as cf: # 使用with open() as
# 檔案內容存取區塊
讀取內容三步驟:開啟、建立reader物件、讀取內容
使用reader物件讀取內容
fn = 'ship.csv' with open(fn, encoding='utf-8') as cf: # 1. 開啟 data = cf.read() # 2. 讀取 print(data)
import csv fn = 'ship.csv' with open(fn, encoding='utf-8') as cf: # 1. 開啟 reader = csv.reader(cf) # 2. 建立reader物件 data = list(reader) # 3. 存取內容: 此處轉換為串列 print(data)
使用一般檔案讀取函式 read()
['58', '比利時號', 'SS Belgic', '2', '1881/11/8', '', 'Steamship', '舊金山-香港', '2652', 'White Star Line', '']
58,比利時號,SS Belgic,2,1881/11/8,,Steamship,舊金山-香港,2652,White Star Line,
import csv ... with open(fn, encoding='utf-8') as cf: # 1. 開啟 cf_reader = csv.reader(cf) # 2. 建立reader物件 ...
import csv ... with open(fn, encoding='utf-8') as cf: # 1. 開啟 cf_reader = csv.reader(cf) # 2. 建立reader物件 ...
呼叫csv.reader()時,以檔案物件為參數
reader物件須轉換為list等資料結構,才能讀取內容
import csv fn = 'ship.csv' with open(fn, encoding='utf-8') as cf: # 1. 開啟 cf_reader = csv.reader(cf) # 2. 建立reader物件 data = list(cf_reader) # 3. 存取內容: 此處轉換為串列 print(data)
import csv fn = 'ship.csv' with open(fn, encoding='utf-8') as cf: # 1. 開啟 cf_reader = csv.reader(cf) # 2. 建立reader物件 data = list(cf_reader) # 3. 存取內容: 此處轉換為串列 print(data)
['58', '比利時號', 'SS Belgic', '2', '1881/11/8', '', 'Steamship', '舊金山-香港', '2652', 'White Star Line', '']
經過reader的處理,逗號已被刪除,且建立起各個欄位
import csv with open('ship.csv', encoding='utf-8') as cf: # 1.開啟檔案 cf_reader = csv.reader(cf) # 2. 建立reader物件 # 3. for迴圈直接以reader物件為處理對象 for line in cf_reader: print(line)
import csv with open('ship.csv', encoding='utf-8') as cf: # 1.開啟檔案 cf_reader = csv.reader(cf) # 2. 建立reader物件 # 3. for迴圈直接以reader物件為處理對象 for line in cf_reader: print(line)
以for迴圈直接處理csv reader物件
reader物件本身便是iterable物件,可用於for迴圈
如果「某物件」有實作__iter__()方法,該方法會產生迭代器(iterator, 可逐一檢視內容的物件),則「某物件」便是iterable物件

import csv with open('ship.csv', encoding='utf-8') as cf: # 1.開啟檔案 cf_reader = csv.reader(cf) # 2. 建立reader物件 data = list(cf_reader) # 3.1 轉換為串列 # 3.2 for迴圈處理串列 for line in data: print(line)
以for迴圈處理轉為串列的csv reader物件
串列也是iterable物件,可用於for迴圈
csv reader物件記錄行號的「指標屬性」: line_num
import csv ..... cf_reader = csv.reader(cf) # 2. 建立reader物件 # 3. for迴圈直接以reader物件為處理對象 for line in cf_reader: print('第%d行: %s' % (cf_reader.line_num, line))
import csv ..... cf_reader = csv.reader(cf) # 2. 建立reader物件 # 3. for迴圈直接以reader物件為處理對象 for line in cf_reader: print('第%d行: %s' % (cf_reader.line_num, line))
import csv ..... cf_reader = csv.reader(cf) # 2. 建立reader物件 # 3. for迴圈直接以reader物件為處理對象 for line in cf_reader: print('第%d行: %s' % (cf_reader.line_num, line))
for迴圈逐一檢視cf_reader內容時,line_num值由1開始逐一遞增

for迴圈逐一檢視
line_num=1
line_num=8
-
從馬偕日記中,找出「海龍號」出現的次數與日期
-
找出任意關鍵字出現的次數
任務
import csv fn = 'MackayDemo-cp950.csv' # 日記檔, cp950編碼 with open(fn) as cf: # 開啟,預設模式'r', 預設編碼cp950 reader = csv.reader(cf) # 建立 reader for line in reader: # 逐行讀取, print(line) # 印出每一行,串列:[日期,日記內文]
import csv fn = 'MackayDemo-cp950.csv' # 日記檔, cp950編碼 with open(fn) as cf: # 開啟,預設模式'r', 預設編碼cp950 reader = csv.reader(cf) # 建立 reader for line in reader: # 逐行讀取, print(line) # 印出每一行,串列:[日期,日記內文]
import csv fn = 'MackayDemo-cp950.csv' # 日記檔, cp950編碼 with open(fn) as cf: # 開啟,預設模式'r', 預設編碼cp950 reader = csv.reader(cf) # 建立 reader for line in reader: # 逐行讀取, print(line[1]) # 只印出日記內文
import csv fn = 'MackayDemo-cp950.csv' # 日記檔, cp950編碼 with open(fn) as cf: # 開啟,預設模式'r', 預設編碼cp950 reader = csv.reader(cf) # 建立 reader for line in reader: # 逐行讀取, print(line[1]) # 只印出日記內文
開啟csv,印出內容,需注意編碼
範例: 開啟檔案,印出所有內容
範例: 使用「串列索引值」印出部份內容
import csv fn = 'MackayFull-cp950.csv' # 日記檔, utf-8編碼 word = '海龍號' total = 0 with open(fn) as cf: # 開啟,預設模式'r', cp950編碼 reader = csv.reader(cf) # 建立 reader for line in reader: # 逐行讀取, txt = line[1] num = txt.count(word) if num != 0: # 有出現 total += num # 次數累加 print(num,' ',line[0]) # 印出次數與日期 print('%s 總共出現 %d次' % (word,total)) # 印出總出現次數
import csv fn = 'MackayFull-cp950.csv' # 日記檔, utf-8編碼 word = '海龍號' total = 0 with open(fn) as cf: # 開啟,預設模式'r', cp950編碼 reader = csv.reader(cf) # 建立 reader for line in reader: # 逐行讀取, txt = line[1] num = txt.count(word) if num != 0: # 有出現 total += num # 次數累加 print(num,' ',line[0]) # 印出次數與日期 print('%s 總共出現 %d次' % (word,total)) # 印出總出現次數
字串物件.count() 可統計出現次數
範例: 特定關鍵字,用字串物件.count(關鍵字)統計出現次數
import csv fn = 'MackayFull-cp950.csv' # 日記檔, utf-8編碼 with open(fn, encoding='cp950') as cf: # utf-8編碼 reader = csv.reader(cf) # 建立 reader while True: word = input('輸入要尋找的關鍵字:') if word.strip() == '': break else: cf.seek(0) total = 0 for line in reader: # 逐行讀取, txt = line[1] num = txt.count(word) if num != 0: # 有出現 total += num # 次數累加 print(num,' ',line[0], line[1]) # 次數 日期 內容 print('%s 總共出現 %d次' % (word,total)) # 印出總出現次數 print('輸入空白字元,程式結束')
import csv fn = 'MackayFull-cp950.csv' # 日記檔, utf-8編碼 with open(fn, encoding='cp950') as cf: # utf-8編碼 reader = csv.reader(cf) # 建立 reader while True: word = input('輸入要尋找的關鍵字:') if word.strip() == '': break else: cf.seek(0) total = 0 for line in reader: # 逐行讀取, txt = line[1] num = txt.count(word) if num != 0: # 有出現 total += num # 次數累加 print(num,' ',line[0], line[1]) # 次數 日期 內容 print('%s 總共出現 %d次' % (word,total)) # 印出總出現次數 print('輸入空白字元,程式結束')
檔案物件.seek(0): 跳回檔案最開頭處
範例: 輸入關鍵字,用字串物件.count(關鍵字)統計出現次數
import csv fn = 'out_file.csv' data = [] # 檔案內容儲存 with open(fn, encoding='utf-8') as cf: reader =csv.reader(cf) for row in reader: data.append(str(row[5]).strip()) # 只存第6欄位 cf.close() find_str = '洋基' for line in data: pos = str(line).find(find_str) # 搜尋字串 if pos>=0: substr = line[pos:pos+len(find_str)] # 切下find_str residual = line[pos+len(find_str):] # 剩下的文字 print(f'{find_str}出現的位置{pos}, 切出來的子字串:{substr}') print(f'剩下的字串:{residual}')
import csv fn = 'out_file.csv' data = [] # 檔案內容儲存 with open(fn, encoding='utf-8') as cf: reader =csv.reader(cf) for row in reader: data.append(str(row[5]).strip()) # 只存第6欄位 cf.close() find_str = '洋基' for line in data: pos = str(line).find(find_str) # 搜尋字串 if pos>=0: substr = line[pos:pos+len(find_str)] # 切下find_str residual = line[pos+len(find_str):] # 剩下的文字 print(f'{find_str}出現的位置{pos}, 切出來的子字串:{substr}') print(f'剩下的字串:{residual}')
字串物件.find(): 尋找第一次出現的位置
範例: 指定關鍵字,字串物件.find(關鍵字) 找出第一次出現的位置
洋基
substr
residual
丟掉
寫入CSV檔
寫入csv三步驟:開啟檔案、寫入內容、關閉檔案
import csv
cf = open('example.csv', 'w') # 1. 開啟
... # 2. 寫入內容
cf.close() # 3. 關閉
以open(檔名,'w')開啟,最後要呼叫close()關閉檔案
import csv
with open('example.csv') as cf: # 1. 開啟檔案
# 2. 區塊指令:寫入內容
# 3. 區塊結束,檔案關閉
以with open(檔名, 'w') as開啟,最後會自動關閉檔案
檔案若未關閉,可能被鎖定,造成下次檔案無法開啟
csv寫入檔案的「開啟模式」與「換行字元」
下列開啟模式皆可寫入檔案
with open('f1.cvs', 'w') as cf: # 1. 開啟檔案
with open('f2.cvs', 'w+') as cf: # 1. 開啟檔案
with open('f3.cvs', 'r+') as cf: # 1. 開啟檔案
with open('f4.cvs', 'a+') as cf: # 1. 開啟檔案
避免寫入時多空一行,設定newline=' '
with open('f3.cvs', 'r+', newline='') as cf:
寫入內容: 建立writer物件, 呼叫writerow()
import csv
fn = 'output.csv'
with open(fn, 'a+', newline='') as cf: # 'a+'為附加模式
cf_writer = csv.writer(cf)
cf_writer.writerow(['姓名','年齡','居住地']) # 標題列
cf_writer.writerow(['王五',30,'台北市']) # 第一筆
cf_writer.writerow(['李四',25,'新北市']) # 第二筆
cf_writer.writerow(['張三',28,'台中市']) # 第三筆
設定delimiter可改變分隔符號(預設為逗號)
import csv fn = 'output.csv' with open(fn, 'w+', newline='') as cf: cf_writer = csv.writer(cf, delimiter='\t') # 設定分隔符號為Tab cf_writer.writerow(['姓名','年齡','居住地']) cf_writer.writerow(['王五',30,'台北市']) cf_writer.writerow(['李四',25,'新北市']) cf_writer.writerow(['張三',28,'台中市'])
import csv fn = 'output.csv' with open(fn, 'w+', newline='') as cf: cf_writer = csv.writer(cf, delimiter='\t') # 設定分隔符號為Tab cf_writer.writerow(['姓名','年齡','居住地']) cf_writer.writerow(['王五',30,'台北市']) cf_writer.writerow(['李四',25,'新北市']) cf_writer.writerow(['張三',28,'台中市'])
delimiter設定於呼叫csv.writer()時

輸出結果
資料夾與檔案路徑
資料夾與檔案路徑
絕對路徑:d:\python\期中考\exam1.py
相對路徑:部份路徑,"期中考\exam1.py", "exam1.py"
❶ os模組:與檔案路徑有關的模組
import os print(os.getcwd()) # 列出目前工作目錄
工作目錄:讀寫檔案的預設資料夾
with open('test.txt') as fobj: data = fobj.read() fobj.close() print(data)

C:/Python
test.txt


reader.py
同一個資料夾

C:/Python
test.txt


reader.py

第十二章
工作目錄
工作目錄
資料夾與檔案路徑
❷ 檢查檔案的路徑: os.path
import os print("檔案或資料夾存在 = ", os.path.exists('ch14')) print("檔案或資料夾存在 = ", os.path.exists('D:\\Python\\ch14')) print("檔案或資料夾存在 = ", os.path.exists('ch14_4.py')) print(" --- ") print("是絕對路徑 = ", os.path.isabs('ch14_4.py')) print("是絕對路徑 = ", os.path.isabs('D:\\Python\\ch14\\ch14_4.py')) print(" --- ") print("是資料夾 = ", os.path.isdir('D:\\Python\\ch14\\ch14_4.py')) print("是資料夾 = ", os.path.isdir('D:\\Python\\ch14')) print(" --- ") print("是檔案 = ", os.path.isfile('D:\\Python\\ch14\\ch14_4.py')) print("是檔案 = ", os.path.isfile('D:\\Python\\ch14'))
資料夾與檔案路徑
❸ 檢查與目錄的操作: os.mkdir(), os.rmdir()
# 建立資料夾 os.mkdir() import os mydir = 'testch14' # 如果mydir不存在就建立此資料夾 if os.path.exists(mydir): print("已經存在 %s " % mydir) else: os.mkdir(mydir) print("建立 %s 資料夾成功" % mydir)
# 刪除資料夾os.rmdir() import os mydir = 'testch14' # 如果mydir存在就刪除此資料夾 if os.path.exists(mydir): os.rmdir(mydir) print("刪除 %s 資料夾成功" % mydir) else: print("%s 資料夾不存在" % mydir)
資料夾與檔案路徑
❸ 檢查與目錄的操作(續)
# 刪除檔案 os.remove() import os myfile = 'test.py' # 如果myfile存在就刪除此檔案 if os.path.exists(myfile): os.remove(myfile) print("刪除 %s 檔案成功" % myfile) else: print("%s 檔案不存在" % myfile)
資料夾與檔案路徑
❸ 檢查與目錄的操作(續)
# mkdir(), chdir(), getcwd()的綜合運用 import os newdir = 'D:\\Python' currentdir = os.getcwd() print("列出目前工作資料夾 ", currentdir) # 如果newdir不存在就建立此資料夾 if os.path.exists(newdir): print("已經存在 %s " % newdir) else: os.mkdir(newdir) print("建立 %s 資料夾成功" % newdir) # 將目前工作資料夾改至newdir os.chdir(newdir) print("列出最新工作資料夾 ", os.getcwd()) # 將目前工作資料夾返回 os.chdir(currentdir) print("列出返回工作資料夾 ", currentdir)
資料夾與檔案路徑
❹ 路徑組合:os.path.join()
# os.path.join() import os print(os.path.join('D:\\', 'Python', 'ch14', 'ch14_9.py')) # 4個參數 print(os.path.join('D:\\Python', 'ch14', 'ch14_9.py')) # 3個參數 print(os.path.join('D:\\Python\\ch14', 'ch14_9.py')) # 2個參數
# 使用串列,結合路徑與檔案名稱 import os files = ['ch14_1.py', 'ch14_2.py', 'ch14_3.py'] for file in files: print(os.path.join('D:\\Python\\ch14', file))
資料夾與檔案路徑
❹' 路徑組合 搭配 絕對路徑 os.path.abspath()
import csv import os # 取得目前資料夾之絕對路徑 __location__ = os.path.abspath(os.path.dirname(__file__)) fn = 'MackayFull-cp950.csv' # 日記檔, utf-8編碼 word = '灰窯仔' # 灰窯 total = 0 with open(os.path.join(__location__, fn)) as cf: reader = csv.reader(cf) # 建立 reader for line in reader: # 逐行讀取, txt = line[1] num = txt.count(word) if num != 0: # 有出現 total += num # 次數累加 print(num,' ',line[0], line[1]) # 印出次數與日期
import csv import os # 取得目前資料夾之絕對路徑 __location__ = os.path.abspath(os.path.dirname(__file__)) fn = 'MackayFull-cp950.csv' # 日記檔, utf-8編碼 word = '灰窯仔' # 灰窯 total = 0 with open(os.path.join(__location__, fn)) as cf: reader = csv.reader(cf) # 建立 reader for line in reader: # 逐行讀取, txt = line[1] num = txt.count(word) if num != 0: # 有出現 total += num # 次數累加 print(num,' ',line[0], line[1]) # 印出次數與日期


dirname(檔名):檔案所在的絕對路徑
__file__:內建變數, 目前執行的檔案名稱

C:/Python
test.txt


reader.py
同一個資料夾
資料夾與檔案路徑
❺ 獲得檔案大小
# os.path.getsize() import os # 如果檔案在目前工作目錄下可以省略路徑 print(os.path.getsize("ch14_1.py")) print(os.path.getsize("D:\\Python\\ch14\\ch14_1.py"))
# os.listdir() import os print(os.listdir("D:\\Python\\ch14")) print(os.listdir(".")) # 這代表目前工作目錄
❻ 獲得工作目錄的內容
資料夾與檔案路徑
import os totalsizes = 0 print("列出D:\\Python\\ch14工作目錄的所有檔案") for file in os.listdir('D:\\Python\\ch14'): print(file) totalsizes += os.path.getsize(os.path.join('D:\\Python\\ch14', file)) print("全部檔案大小是 = ", totalsizes)
練習:列出特定目錄所有檔案的大小
資料夾與檔案路徑
import glob print("方法1:列出\\Python\\ch14工作目錄的所有檔案") for file in glob.glob('D:\\Python\\ch14\*.*'): print(file) print("方法2:列出目前工作目錄的特定檔案") for file in glob.glob('ch14_1*.py'): print(file) print("方法3:列出目前工作目錄的特定檔案") for file in glob.glob('ch14_2*.*'): print(file)
❼ 獲得特定工作目錄內容:glob模組
可以使用「萬用字元」:*
資料夾與檔案路徑
import os for dirName, sub_dirN, fileNames in os.walk('oswalk'): print("目前工作目錄名稱: ", dirName) print("目前子目錄名稱串列: ", sub_dirN) print("目前檔案名稱串列: ", fileNames, "\n")
❽ 走訪所有目錄樹節點:os.walk()
回傳3個值: 工作目錄名稱, 子目錄串列, 檔案串列

Python程式設計-檔案與資料夾
By Leuo-Hong Wang
Python程式設計-檔案與資料夾
Lesson 11: 檔案與資料夾
- 1,353