檔案處理

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 檔案中

下課

真的不難啦