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