Skip to content

[Python]基本教學(14) os, 讀寫檔案

Last Updated on 2021-04-07 by Clay

今天想要向大家介紹的是 Python 裡頭 os 模組的使用以及檔案讀寫的方法。

尤其是在做 NLP (自然語言處理)相關的研究,檔案讀寫等等更是絕對要學會的技能。

那麼,今天我便簡單地介紹一下常用到的 os 模組,以及該怎麼使用 Python 進行簡單的檔案讀寫吧!


os 模組

要使用這個方便的模組,首先我們必須 import 進這個 Python 內建的套件。

import os


然後我將介紹最基本、也最常用的『如何創造資料夾』、『如何刪除資料夾』、『如何獲取資料夾底下的檔案名稱』。

os.mkdir('./os_practice')


首先,我們透過這個指令,在當前 script 的目錄底下創建了 os_practice 資料夾。

那麼,若我們想刪除這個資料夾(或特定的其他資料夾),那麼我們只需要下一個簡單的指令:

os.rmdir('./os_practice')


這樣就可以刪除我們所輸入的資料夾了!是不是很簡單呢?

但我們先不要做這個『刪除資料夾』的動作,以下,再紀錄一個簡單地查詢資料夾的方法。

假設我們在創造的資料夾底下放入了三個檔案(這裡我真的放進去了)。分別是 text01.txt, text02.txt, text03.txt。

print(os.listdir('./os_practice/'))


Output:

['text01.txt', 'text02.txt', 'text03.txt']

使用 listdir() 指令便會印出來了!

os 這個模組底下的操作還有很多種,要使用 Python 撰寫自動化腳本可說是必不可少的。大家可以根據自己的需求去查詢一下相關的用法,今天我只是盡量撿簡單的來講。


檔案讀寫

檔案的讀寫基本上大同小異,差別在於我們 open 檔案的時候採用什麼樣的模式。

基本上常用的便是『r』,『w』,『a』這三種模式。

r 是讀取這個檔案,可配合 read() 使用。

w 是寫入這個檔案,可配合 write() 使用。

a 是『續寫』這個檔案,可以在使用 write() 寫入檔案後,不影響這個檔案原本所含有的內容,而是繼續往下新增。

首先進行一下簡單的示範:剛剛我在 os_practice 底下放入了三份文本,三份文本裡頭各自含有不同的內容,現在我們就通過讀取分別印出三份文本的文字。

import os

text_list = os.listdir('./os_practice/')

for text in text_list:
    if text.endswith('.txt'):
        print('%s:' % text, open('os_practice/%s' % text, 'r', encoding='utf-8').read())


Output:

text01.txt: 今天天氣真好!
text02.txt: 今天天氣真差!
text03.txt: 欸欸聽說有颱風欸!

首先,一開始 import 進 os 的部份。緊接著,我們將剛才所建的資料夾 os_practice 使用 os.listdir() 印出底下的所有檔案,並將其以 List 的資料型態存入變數 text_list 當中。

然後,我們使用 for 迴圈讀取不同的檔案。

這裡要小心的是,我們使用了 endswith() 這個函式來確認檔案是否以 .txt 結尾,若是,我們這才進行後面的處理。

可以看到,我們 open 了一個檔案,首先輸入檔案的位置(也就是在 os_practice 下),然後使用模式 "r" 讀取文本,編碼 encoding 設定為 UTF-8 (Python 中,所有字元的編碼都是 UTF-8, Windows 底下若不設定通常會報錯)。

於是,我們就迴圈印出文本中的內容。

那,如果我們想要修改某個文本呢?

以第一個文本為例,我們的文本為:

text01.txt: 今天天氣真好!

那今天我們做點小小的修改:

newContent = '你確定今天天氣真的好嗎?'

open('os_practice/text01.txt', 'w', encoding='utf-8').write(newContent)

print('text01.txt:',open('os_practice/text01.txt', 'r', encoding='utf-8').read())


Output:

text01.txt: 你確定今天天氣真的好嗎?

我們可以看到,我們將 newContent 這個變數裡頭的文字存入了 text01.txt 裡頭,然後它取代了原先的內容。

那如果今天我們並不想取代原本的內容,只是想要在後頭新增東西呢?

這時,我們需要將我們的模式 "w" 更改為模式 "a"。

我們以 text02 舉例:

text02.txt: 今天天氣真差!

然後我們對剛才的程式做一點小小的修改。

newContent = '真的假的啊喂。'

open('os_practice/text02.txt', 'a', encoding='utf-8').write(newContent)

print('text02.txt:', open('os_practice/text02.txt', 'r', encoding='utf-8').read())


Output:

text02.txt: 今天天氣真差!真的假的啊喂。

如何?我們是不是沒有修改本來的文字,而是直接更新在後頭了呢?


以上便是今天的 Python 基本教學。

很快地,下次的筆記可能是基本教學的最後一次筆記了 —— 接下來我會紀錄點比較重要、且比較實戰的東西了。

我希望我會喜歡寫那些東西。


References


Read More

Leave a Reply