檔案處理
Python - Lesson 6
講師:溫室蔡
如何開啟檔案
變數 = open(檔案名稱, 模式)
f = open('file.txt', 'r')
關於檔案名稱、 開啟模式
以及這個變數裡面到底裝了什麼
將會一一解釋
檔案路徑
有上專案建置的人會知道
檔案路徑分為相對路徑與絕對路徑
這裡的相對是相對於 Python 檔案的位置
絕對則是從 C、D 槽(Windows)
或根目錄、家目錄(macOS、Linux)
為起點去找檔案
檔案路徑
# 相對路徑:同個資料夾底下的檔案
'file.txt'
# 相對路徑:同資料夾底下的另一個資料夾裡的檔案
'dir/file.txt'
# 相對路徑:上一層資料夾下的檔案
'../file.txt'
# 絕對路徑 (Windows):
'C:/Users/user/Desktop/file.txt'
# 絕對路徑 (macOS, Linux,根目錄):
'/tmp/file.txt'
# 絕對路徑 (macOS, Linux,家目錄):
'~/file.txt'
開啟模式
'r' # 讀取
'w' # 覆寫
'a' # 接在後面
'x' # 開新檔案
# 額外模式:加在以上任一模式後面
'b' # 用二進制模式打開
'+' # 可讀取也可寫入
開啟模式
模式 | 檔案存在 | 檔案不存在 |
---|---|---|
r(讀取) | 正常運作 | 出錯 |
w(覆寫) | 把內容清空 | 開空檔案 |
a(新增) | 正常運作 | 開空檔案 |
x(建檔) | 出錯 | 開空檔案 |
什麼是二進制模式
不是所有檔案都是純文字檔案
如果要讀寫的根本不是文字檔
比如圖片、音訊、自創格式等
就要使用二進制模式開啟檔案
額外參數:encoding
電腦裡的文字其實都是 1 跟 0
要怎麼解讀得看編碼方式
UTF-8 是國際通用的編碼
但在台灣就有另一個稱為 Big5 的編碼
用錯誤的編碼打開就會出現亂碼
f = open('file.txt', 'r', encoding='utf-8')
f = open('file.txt', 'r', encoding='big5')
變數裡面裝什麼
open() 回傳的東西是一個「檔案物件」
f = open('file.txt', 'r')
也就是說,它有自己的「方法」
其中當然也包括了讀取與寫入
close():關閉檔案
檔案開了後要關掉
f = open('file.txt', 'r')
# 檔案操作
f.close()
不然會佔記憶體空間
關了之後就不能再對檔案進行操作
我怕我忘記 close
可以用 with-as 語法
with open('file.txt', 'r') as f:
# 檔案操作
檔案物件離開 with-as 區塊就會自動關閉
write():寫入內容
收一個字串當參數
with open('file.txt', 'w') as f:
f.write('This is a text file, \n')
f.write('and will be the example to be read.\n')
把這個字串寫入檔案
read():讀取內容
收一個整數當參數
with open('file.txt', 'r') as f:
print(f.read(8)) # This is
print(f.read(6)) # a text
print(f.read())
# file,
# and will be the example to be read.
代表要讀幾個字元
也可以不收參數,把剩下的都讀進來
重要概念:游標
This is a text file, \nand will be the example to be read.
檔案內容對 Python 來說
是一條字元「流」(stream)
其中有一個「游標」
檔案的讀寫都是以游標為基準進行
This is
同時也會移動游標的位置
重要概念:游標
This is a text file, \nand will be the example to be read.
This is
f.read(7)
a text file, \nand
重要概念:游標
This is a text file, \nand will be the example to be read.
This is
f.read(19)
a text file, \nand
重要概念:游標
This is a text file, \nand will be the example to be read.
This is
f.write('hello world')
a text file, \nand
hello world
如何得知、改變游標位置
This is a text file, \nand will be the example to be read.
This is
f.tell()
a text file, \nand
hello world
37
如何得知、改變游標位置
This is a text file, \nand will be the example to be read.
This is
f.seek(0)
a text file, \nand
hello world
0
行行出狀元
如果把檔案物件丟進 for 迴圈會怎樣
with open('file.txt', 'r') as f:
for line in f:
print(line)
# This is a text file
# and will be the example to be read.
我不想用迴圈
with open('file.txt', 'r') as f:
print(f.readline())
# This is a text file
print(f.readline())
# and will be the example to be read.
readline() 把下一行讀進來
一行一行,存起來
with open('file.txt', 'r') as f:
a = f.readlines()
print(a)
# ['This is a text file', 'and will be the example to be read.']
readlines() 把剩下的每一行
存在列表裡
教完了… 嗎
我預期內容不夠一節課
來多教一個特定的檔案格式吧
JSON
JSON 是什麼樣的檔案格式
定義一個物件
{
"name": "Justin",
"age": 17,
"is_male": true,
"languages": [
"Chinese",
"English",
"Python",
"C++"
],
"phone": {
"name": "iPhone 6S Plus",
"brand": "Apple",
"storage": 64
}
}
有各個屬性
可以是數字、字串
布林值、陣列
另一個物件等
似曾相識
這不就是 Python 的字典嗎!!!
忘記字典是啥的,可以看一下
總之它們基本上是一樣的東西
所以可以很容易地進行轉換
Python 的 json 模組
整個 json 模組你只需要知道兩個方法
import json
json.load() 跟 json.dump()
一個把檔案轉字典
一個把字典轉檔案
JSON 檔轉 Python 字典
json.load(檔案物件)
with open('data.json', 'r') as f:
d = json.load(f)
print(d['name']) # Justin
print(d['languages'][2]) # Python
print(d['phone']['brand']) # Apple
回傳一個字典
Python 字典存成 JSON 檔
json.dump(字典, 檔案物件)
d = {
"name": "Justin",
"age": 17,
"is_male": True
}
with open('data.json', 'w') as f:
json.dump(d, f)
把字典寫入一個 JSON 檔案中
下課
真的不難啦