Python 標(biāo)準(zhǔn)庫(kù)之 os 模塊
1. 訪問(wèn)文件
1.1 os.open(path, flags)
os.open(path, flags) 的功能是打開文件:
- 參數(shù) path,要打開的文件
- 參數(shù) flags,可能取值如下
- os.O_RDONLY,以只讀方式打開
- os.O_WRONLY,以只寫方式打開
- os.O_RDWR,以可讀可寫方式打開
- os.O_CREAT,創(chuàng)建并打開一個(gè)新文件
- 返回值
- 返回一個(gè)整數(shù)表示被打開的文件
- 該整數(shù)又被稱為文件描述符 (file descriptor),縮寫為 fd
1.2 os.read(fd, count)
os.read(fd, count) 的功能是讀取文件:
- 參數(shù) fd,使用 open 打開的文件描述
- 參數(shù) count,至多讀取 count 個(gè)字節(jié)
- 返回值
- 返回讀取的 binary,binary 中至多包含 count 個(gè)字節(jié)
- 如果文件已達(dá)到結(jié)尾, 返回一個(gè)空 binary
1.3 os.write(fd, binary)
os.write(fd, binary) 的功能是寫文件:
- 參數(shù) fd, 使用 open 打開的文件描述
- 參數(shù) binary,將 binary 寫入到文件中
- 返回值,返回實(shí)際寫入的字節(jié)個(gè)數(shù)
1.4 os.close
os.close(fd) 的功能是關(guān)閉文件描述符,使用 open 打開文件后,需要使用 close 關(guān)閉。
1.5 例子:復(fù)制文件
使用以上的函數(shù)編寫一個(gè)復(fù)制文件的程序 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 行,編寫函數(shù) copy
- sourcePath 是源文件路徑,targetPath 是目標(biāo)文件路徑
- 在第 4 行,打開源文件
- os.O_RDONLY 表示以只讀方式打開
- 在第 5 行,打開目標(biāo)文件
- os.O_WRONLY 表示以只寫方式打開
- os.O_CREAT 表示創(chuàng)建一個(gè)新文件
- 在第 9 行,如果讀取的 binary 的長(zhǎng)度為 0,則表示讀取到文件末尾
- 在第 13 行,將文件 test.txt 復(fù)制到文件 test.bak
運(yùn)行程序,輸出如下:
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 行,運(yùn)行程序 copy.py
- 在第 2 行,使用 dir 命令顯示當(dāng)前目錄
- 結(jié)果表明,在當(dāng)前目錄下新生成一個(gè)文件 test.bak
2. 訪問(wèn)目錄
2.1 os.getcwd()
os.getcwd 的功能是獲取當(dāng)前工作目錄。該函數(shù)的使用示例:
>>> import os
>>> os.getcwd()
'C:\\Users\\Administrator\\Downloads'
注意,在 windows 中,路徑分隔符 \ 和 Python 的轉(zhuǎn)義字符 \ 相同,需要對(duì)路徑中的字符 \ 進(jìn)行轉(zhuǎn)義。
2.2 os.chdir(path)
os.chdir(path) 的功能切換當(dāng)前工作目錄。該函數(shù)的使用示例:
>>> import os
>>> os.chdir('C:\\Windows')
>>> os.getcwd()
'C:\\Windows'
2.3 os.listdir(path)
os.listdir(path) 的功能是列出指定目錄下的文件名:
- 參數(shù) path,path 是目錄的路徑
- 返回值,返回一個(gè)字符串列表,列表是目錄下的文件名
該函數(shù)的使用示例:
>>> 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) 的功能是創(chuàng)建目錄,該函數(shù)的使用示例:
>>> import os
>>> os.mkdir('test')
3. 路徑名
3.1 os.path 模塊
os.path 模塊是 os 模塊的子模塊,用于處理文件路徑名。
路徑名由兩部分構(gòu)成:目錄名和文件名。例如:路徑 C:\Windows\Readme.txt,目錄名為 C:\Windows,文件名為 Readme.txt。
3.2 os.path.basename(path)
os.path.basename 的功能是獲取路徑名中的文件名,該函數(shù)的使用示例:
>>> import os
>>> os.basename('C:\\Windows\\Readme.txt')
'Readme.txt'
3.3 os.path.dirname(path)
os.path.dirname 的功能是獲取路徑名中的目錄名,該函數(shù)的使用示例:
>>> import os
>>> os.dirname('C:\\Windows\\Readme.txt')
'C:\\Windows'
3.4 os.sep
os.sep 是 os 模塊的導(dǎo)出變量,定義了文件路徑名的分割符:
- 在 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’ 連接形成一個(gè)新的路徑。
3.5 os.path.join(*args)
os.path.join(*args) 接受可變數(shù)量的參數(shù),將所有的輸入?yún)?shù)使用路徑分隔符連接,形成一個(gè)新的路徑名。
- 參數(shù) *args,args 是可變參數(shù)
- 返回值,返回由輸入?yún)?shù)組成的新路徑
該函數(shù)的使用示例:
>>> 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 個(gè)字符串連接形成一個(gè)路徑名
- 在第 4 行,將 3 個(gè)字符串連接形成一個(gè)路徑名
3.6 os.path.exists(path)
os.path.exists(path) 檢查文件是否存在:
- 參數(shù) path, 文件路徑
- 返回值,如果文件存在則返回 True,如果文件不存在則返回 False
該函數(shù)的使用示例:
>>> 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) 獲取指定路徑的文件的大小,該函數(shù)的使用示例:
>>> import os
>>> os.path.getsize('C:\\Users\\desktop.ini')
174
4.2 os.path.isfile(path)
操作系統(tǒng)中,常見(jiàn)的文件類型有兩種:
- 普通文件
- 文本文件或者二進(jìn)制數(shù)據(jù)文件被稱為普通文件
- 目錄文件
os.path.isfile(path) 判斷文件是否為普通文件,該函數(shù)的使用示例:
>>> 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) 判斷文件是否為目錄文件,該函數(shù)的使用示例:
>>> import os
>>> os.path.isdir('C:\\Windows\\notepad.exe')
False
>>> os.path.isdir('C:\\Windows')
True
4.4 例子:遞歸列出目錄
假設(shè)存在 test 目錄,test 目錄下的子文件和子目錄如下圖所示:
現(xiàn)在要求編寫程序 listDir.py,列出 test 目錄下所有的文件,listDir.py 的內(nèi)容如下:
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 行,如果子文件是目錄,遞歸調(diào)用 listDir 列出它的所有文件
運(yùn)行程序,輸出結(jié)果如下:
test\a
test\b
test\b\x.txt
test\b\y.txt
test\c
test\readme.txt