1. 程式人生 > Python進階應用教學 >14 Python 標準庫之 os 模組

14 Python 標準庫之 os 模組

1. 訪問檔案

1.1 os.open(path, flags)

os.open(path, flags) 的功能是開啟檔案:

  • 引數 path,要開啟的檔案
  • 引數 flags,可能取值如下
    • os.O_RDONLY,以只讀方式開啟
    • os.O_WRONLY,以只寫方式開啟
    • os.O_RDWR,以可讀可寫方式開啟
    • os.O_CREAT,建立並開啟一個新檔案
  • 返回值
    • 返回一個整數表示被開啟的檔案
    • 該整數又被稱為檔案描述符 (file descriptor),縮寫為 fd

1.2 os.read(fd, count)

os.read(fd, count) 的功能是讀取檔案:

  • 引數 fd,使用 open 開啟的檔案描述
  • 引數 count,至多讀取 count 個位元組
  • 返回值
    • 返回讀取的 binary,binary 中至多包含 count 個位元組
    • 如果檔案已達到結尾, 返回一個空 binary

1.3 os.write(fd, binary)

os.write(fd, binary) 的功能是寫檔案:

  • 引數 fd, 使用 open 開啟的檔案描述
  • 引數 binary,將 binary 寫入到檔案中
  • 返回值,返回實際寫入的位元組個數

1.4 os.close

os.close(fd) 的功能是關閉檔案描述符,使用 open 開啟檔案後,需要使用 close 關閉。

1.5 例子:複製檔案

使用以上的函式編寫一個複製檔案的程式

copy.py:

import os

def copy(sourcePath, targetPath):
    sourceFd = os.open(sourcePath, os.O_RDONLY)
    targetFd = os.open(targetPath, os.O_WRONLY | os.O_CREAT)

    while (True):
        binary = os.read(sourceFd, 512)
        if len(binary) == 0:
            return
        os.write(targetFd, binary)
copy('test.txt', 'text.bak')
  • 在第 1 行,引入 os 模組
  • 在第 3 行,編寫函式 copy
    • sourcePath 是原始檔路徑,targetPath 是目標檔案路徑
  • 在第 4 行,開啟原始檔
    • os.O_RDONLY 表示以只讀方式開啟
  • 在第 5 行,開啟目標檔案
    • os.O_WRONLY 表示以只寫方式開啟
    • os.O_CREAT 表示建立一個新檔案
  • 在第 9 行,如果讀取的 binary 的長度為 0,則表示讀取到檔案末尾
  • 在第 13 行,將檔案 test.txt 複製到檔案 test.bak

執行程式,輸出如下:

C:\> python copy.py
C:\> dir
2001/10/01  10:40    <DIR>          .
2001/10/01  10:40    <DIR>          ..
2001/10/01  10:40               333 copy.py
2001/10/01  09:48                19 test.txt
2001/10/01  10:40                19 text.bak
  • 在第 1 行,執行程式 copy.py
  • 在第 2 行,使用 dir 命令顯示當前目錄
    • 結果表明,在當前目錄下新生成一個檔案 test.bak

2. 訪問目錄

2.1 os.getcwd()

os.getcwd 的功能是獲取當前工作目錄。該函式的使用示例:

>>> import os
>>> os.getcwd()
'C:\\Users\\Administrator\\Downloads'

注意,在 windows 中,路徑分隔符 \ 和 Python 的轉義字元 \ 相同,需要對路徑中的字元 \ 進行轉義

2.2 os.chdir(path)

os.chdir(path) 的功能切換當前工作目錄。該函式的使用示例:

>>> import os
>>> os.chdir('C:\\Windows')
>>> os.getcwd()
'C:\\Windows'

2.3 os.listdir(path)

os.listdir(path) 的功能是列出指定目錄下的檔名:

  • 引數 path,path 是目錄的路徑
  • 返回值,返回一個字串列表,列表是目錄下的檔名

該函式的使用示例:

>>> import os
>>> os.listdir('C:\\Program Files')
['Common Files', 'desktop.ini', 'Git', 'IIS', 'Intel', 'Internet Explorer', 'JetBrains', 'Microsoft Help Viewer', 'Microsoft Office', 'Microsoft SQL Server', 'Microsoft Visual Studio 9.0', 'Microsoft.NET', 'Mozilla Firefox', 'Office', 'Oracle', 'PuTTY', 'Sublime Text 2', 'tcc', 'Typora', 'Uninstall Information', 'Windows admin', 'Windows Identity Foundation', 'Windows Kits', 'Windows Mail', 'Windows Media Player']

2.4 os.mkdir(path)

os.mkdir(path) 的功能是建立目錄,該函式的使用示例:

>>> import os
>>> os.mkdir('test')

3. 路徑名

3.1 os.path 模組

os.path 模組是 os 模組的子模組,用於處理檔案路徑名。

路徑名由兩部分構成:目錄名和檔名。例如:路徑 C:\Windows\Readme.txt,目錄名為 C:\Windows,檔名為 Readme.txt。

3.2 os.path.basename(path)

os.path.basename 的功能是獲取路徑名中的檔名,該函式的使用示例:

>>> import os
>>> os.basename('C:\\Windows\\Readme.txt')
'Readme.txt'

3.3 os.path.dirname(path)

os.path.dirname 的功能是獲取路徑名中的目錄名,該函式的使用示例:

>>> import os
>>> os.dirname('C:\\Windows\\Readme.txt')
'C:\\Windows'

3.4 os.sep

os.sep 是 os 模組的匯出變數,定義了檔案路徑名的分割符:

  • 在 linux 中,os.sep 等於 /
  • 在 windows 中,os.sep 等於 \

os.sep 的用法如下:

>>> import os
>>> os.sep
'\\'
>>> 'C:\\Windows' + os.sep + 'Readme.txt'
'C:\\Windows\\Readme.txt'

在第 4 行,使用 os.sep 將 ‘C:\Windows’ 和 ‘Readme.txt’ 連線形成一個新的路徑。

3.5 os.path.join(*args)

os.path.join(*args) 接受可變數量的引數,將所有的輸入引數使用路徑分隔符連線,形成一個新的路徑名。

  • 引數 *args,args 是可變引數
  • 返回值,返回由輸入引數組成的新路徑

該函式的使用示例:

>>> import os
>>> os.path.join('C:\\Windows', 'Readme.txt')
'C:\\Windows\\Readme.txt'
>>> os.path.join('C:\\Windows', 'System32', 'Kernel.dll')
'C:\\Windows\\System32\\Kernel.dll'
  • 在第 2 行,將 2 個字串連線形成一個路徑名
  • 在第 4 行,將 3 個字串連線形成一個路徑名

3.6 os.path.exists(path)

os.path.exists(path) 檢查檔案是否存在:

  • 引數 path, 檔案路徑
  • 返回值,如果檔案存在則返回 True,如果檔案不存在則返回 False

該函式的使用示例:

>>> import os
>>> os.path.exists('C:\\Windows')
True
>>> os.path.exists('C:\\non-exist-file')
False

4. 檔案屬性

4.1 os.path.getsize(path)

os.path.getsize(path) 獲取指定路徑的檔案的大小,該函式的使用示例:

>>> import os
>>> os.path.getsize('C:\\Users\\desktop.ini')
174

4.2 os.path.isfile(path)

作業系統中,常見的檔案型別有兩種:

  • 普通檔案
    • 文字檔案或者二進位制資料檔案被稱為普通檔案
  • 目錄檔案

os.path.isfile(path) 判斷檔案是否為普通檔案,該函式的使用示例:

>>> import os
>>> os.path.isfile('C:\\Windows\\notepad.exe')
True
>>> os.path.isfile('C:\\Windows')
False

4.3 os.path.isdir(path)

os.path.isdir(path) 判斷檔案是否為目錄檔案,該函式的使用示例:

>>> import os
>>> os.path.isdir('C:\\Windows\\notepad.exe')
False
>>> os.path.isdir('C:\\Windows')
True

4.4 例子:遞迴列出目錄

假設存在 test 目錄,test 目錄下的子檔案和子目錄如下圖所示:

圖片描述

用於測試的目錄樹

現在要求編寫程式 listDir.py,列出 test 目錄下所有的檔案,listDir.py 的內容如下:

import os

def listDir(dir):
    entries = os.listdir(dir)
    for entry in entries:
        path = os.path.join(dir, entry)
        print(path)
        if os.path.isdir(path):
            listDir(path)

listDir('test')
  • 在第 4 行,使用 os.listdir(dir) 獲取目錄 dir 下的檔名列表
  • 在第 5 行,遍歷該列表,entry 為子檔案的檔名
    • 在第 6 行,使用 os.path.join 生成子檔案的完整路徑
    • 在第 7 行,列印子檔案的完整路徑 path
    • 在第 8 行,如果子檔案是目錄,遞迴呼叫 listDir 列出它的所有檔案

執行程式,輸出結果如下:

test\a
test\b
test\b\x.txt
test\b\y.txt
test\c
test\readme.txt