亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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