Python 的標準函式「os」提供了操作系統中檔案的方法,可以針對檔案進行重新命名、編輯、刪除等相關操作,這篇教學將會介紹 os 常用的方法。
原文參考:檔案操作 os
本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )
如果使用 Colab,需要和 Google 雲端硬碟連動,請參考:連動 Google Drive
下方列出幾種 os 模組常用的方法 ( 參考 Python 官方文件:os 多種操作系統接口 ):
方法 | 參數 | 說明 |
---|---|---|
getcwd() | 取得目前程式的工作資料夾路徑 | |
chdir() | path | 改變程式的工作資料夾路徑 |
mkdir() | folder | 建立資料夾 |
rmdir() | folder | 刪除空資料夾 |
listdir() | folder | 列出資料夾裡的內容 |
open() | file, mode | 開啟檔案 |
write() | string | 寫入內容到檔案 |
rename() | old, new | 重新命名檔案 |
remove() | file | 刪除檔案 |
stat() | file | 取得檔案的屬性 |
close() | file | 關閉檔案 |
path | 取得檔案的各種屬性 | |
system | 執行系統命令 ( 等同使用 cmd 或終端機輸入指令 ) |
要使用 os 必須先 import os 模組,或使用 from 的方式,單獨 import 特定的類型。
import os
from os import chdir
os.getcwd() 可以取得 .py 程式運作的工作資料夾路徑,下面的程式是 Colab 預設的工作資料夾。
import os
print(os.getcwd()) # /content
os.chdir(path) 可以修改 .py 程式運作的工作資料夾為指定的路徑 path,下面的程式會修改 Colab 預設的工作目錄。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks')
# 原本在 /content,改到 /content/drive/MyDrive/Colab Notebooks
f = open('test.txt','r')
print(f.read()) # hello world
f.close()
os.mkdir(folder) 可以在指定的目錄下,建立一個新的資料夾。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks')
os.mkdir('demo') # 建立一個名為 demo 的資料夾
os.mkdir('demo/hello') # 建立一個在 demo 資料夾裡的 hello 資料夾
os.rmdir(folder) 會刪除一個「空」的資料夾 ( 裡面不能有其他檔案或資料夾 )。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks')
os.rmdir('demo') # 如果 demo 資料夾是空的,就會被刪除
os.listdir(folder) 會以串列的形式,列出資料夾中所有的內容。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks')
os.listdir('demo') # ['demo.txt', '.ipynb_checkpoints']
os.open(file, mode) 可以開啟指定的檔案,開啟檔案時需要設定模式 mode ( 更多參考:os.open ),如果需要多種模式可使用「|」區隔,常用的模式如下表所示:
模式 | 說明 |
---|---|
os.O_RDONLY | 以只讀的方式打開 |
os.O_WRONLY | 以只寫的方式打開 |
os.O_RDWR | 以讀寫的方式打開 |
os.O_APPEND | 以追加的方式打開 |
os.O_CREAT | 建立並打開一個新檔案 |
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks')
f = os.open('demo/demo.txt', os.O_RDWR|os.O_CREAT) # 建立一個可讀寫的 demo.txt
os.write(file, str) 可以將指定的文字寫入檔案裡,如果執行過程中出現「TypeError: a bytes-like object is required, not ‘str’」的問題,表示寫入的編碼需要轉換,只需要在後方加入「.encode」就能順利完成。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks')
f = os.open('demo/demo.txt', os.O_RDWR) # 開啟 demo.txt 檔案
str = 'good morning!!!' # 設定寫入的文字
os.write(f, str.encode()) # 將文字寫入檔案
os.rename(old, new) 可以將指定的檔案更換名稱,如果有副檔名表示檔案,如果沒有副檔名表示資料夾。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks')
os.rename('test.txt', 'demo.txt') # 將 test.txt 更名為 demo.txt
os.rename('demo', 'demo2') # 將 demo 資料夾更名為 demo2
os.remove(file) 可以刪除指定的檔案。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks')
os.remove('demo/demo.txt') # 刪除 demo.txt
os.stat(file) 可以取得指定檔案的屬性。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks')
print(os.stat('demo/demo.txt'))
# os.stat_result(st_mode=33152, st_ino=54, st_dev=36, st_nlink=1, st_uid=0, st_gid=0, st_size=30, st_atime=1637132386, st_mtime=1637132381, st_ctime=1637132386)
os.close(file) 可以將開啟的檔案關閉,釋放記憶體。
使用 os.path 可以取得檔案的各種屬性,os.path 具有下列幾種常用的使用方法:
方法 | 說明 |
---|---|
abspath(path) | 回傳絕對路徑。 |
basename(path) | 回傳檔案名稱。 |
dirname(path) | 回傳檔案路徑。 |
exists(path) | 判斷檔案路徑是否存在,回傳 True 或 False。 |
getatime(path) | 回傳最近訪問時間(浮點型秒數) |
getmtime(path) | 回傳最近修改檔案的時間 ( 1970 年 1 月 1 日 00:00:00 開始到修改檔案的秒數 ) |
getctime(path) | 回傳建立檔案時間。 |
getsize(path) | 回傳檔案大小。 |
isabs(path) | 判斷是否為絕對路徑,回傳 True 或 False。 |
isfile(path) | 判斷路徑是否為文件,回傳 True 或 False。 |
isdir(path) | 判斷路徑是否為目錄,回傳 True 或 False。 |
join(path1, path2....) | 把目錄和檔案名合成一個路徑 |
realpath(path) | 回傳 path 的真實路徑 |
relpath(path, start) | 從 start 計算相對路徑 |
samefile(path1, path2) | 判斷兩個檔案或目錄是否相同 |
sameopenfile(fp1, fp2) | 判斷 fp1 和 fp2 是否指向同一檔案 |
samestat(stat1, stat2) | 判斷stat tuple stat1 和 stat2 是否指向同一個文件 |
split(path) | 把路徑分割成 dirname 和 basename,返回一個元組 |
splitext(path) | 分割路徑,返回路徑名和文件副檔名的檔案 |
下方的程式碼,會使用 os.path 取得檔案相關資訊。
import os
path = os.getcwd() + '/drive/MyDrive/Colab Notebooks/test.txt'
print(os.path.basename(path)) # test.txt
print(os.path.dirname(path)) # /content/drive/MyDrive/Colab Notebooks
print(os.path.exists(path)) # True
print(os.path.getatime(path)) # 1637052462.0
print(os.path.getmtime(path)) # 1637052462.0
print(os.path.getctime(path)) # 1637052462.0
print(os.path.getsize(path)) # 30
print(os.path.isabs(path)) # True
print(os.path.isfile(path)) # True
print(os.path.isdir(path)) # False
print(os.path.realpath(path)) # /content/drive/MyDrive/Colab Notebooks/test.txt
print(os.path.samefile(path, path)) # True
print(os.path.split(path)) # ('/content/drive/MyDrive/Colab Notebooks', 'test.txt')
print(os.path.splitdrive(path)) # ('', '/content/drive/MyDrive/Colab Notebooks/test.txt')
print(os.path.splitext(path)) # ('/content/drive/MyDrive/Colab Notebooks/test', '.txt')
print(os.path.join('content','drive','test.txt')) # content/drive/test.txt
os.system(命令) 的效果等同於在電腦的終端機或 cmd 裡,輸入並執行系統命令,但由於作業系統的不同,命令也會有所不同,下方列出一些 Windows 和 Linux 裡常用的指令:
Windows:
指令 | 說明 |
---|---|
cd | 切換資料夾位置 |
cls | 清除螢幕 |
md/mkdir | 建立資料夾 |
rd/rmdir | 刪除資料夾 |
ren/rename | 重新命名 |
dir | 列出目錄與子目錄 |
del/erase | 刪除一個或多個檔案 |
move | 移動檔案 |
copy | 複製檔案 |
xcopy | 複製檔案與樹狀目錄 |
Linux:
指令 | 說明 |
---|---|
cd | 切換資料夾位置 |
pwd | 顯示所在目錄 |
ls | 列出檔案清單 |
clear | 清除螢幕 |
mkdir | 建立資料夾 |
rm | 刪除檔案或資料夾 |
mv | 移動/重新命名檔案 |
cp | 複製檔案 |
下方的例子,效果等同於直接在終端機使用指令,建立資料夾、列出目錄、開啟檔案與刪除檔案。
import os
os.system("mkdir test") #建立資料夾
os.system("cp test.txt ./demo") # 複製至 demo 資料夾裡 ( Windows 使用 copy )
os.system("rm test.txt/") # 刪除檔案 ( Windows 使用 del )
os.system("open test.txt") # 使用預設轉體開啟 test.txt
大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我有個超過一千篇教學的 STEAM 教育學習網,有興趣可以參考下方連結呦~ ^_^
在 write(file, str) 的範例,你使用了 str
作為變數名稱,這會覆蓋 Python 內建的 str
,建議改用其他名稱。