跳到主要内容

操作文件和目录

在 Python 中操作文件、目录,可调用 os 模块(以及 os.path)提供的接口,它们封装了操作系统提供的接口函数;部分功能由 shutil 补充(如复制文件)。

1. 操作系统信息

  • import os 后使用。
  • os.name:操作系统类型;'posix' 表示 Linux / Unix / macOS,'nt' 表示 Windows。
  • os.uname():返回详细系统信息(仅 posix 系统,Windows 上不提供);说明 os 中部分函数与操作系统相关。

2. 环境变量

  • os.environ:保存当前进程可见的全部环境变量(类字典)。
  • os.environ.get('key'):获取指定环境变量的值;os.environ.get('key', 'default') 可指定键不存在时的默认值。
import os
os.environ.get('PATH')
os.environ.get('x', 'default') # 'default'

3. 路径与目录:os.path 与 os

  • 相关函数一部分在 os,一部分在 os.path,使用时常需同时用到两者。
  • 路径拼接:用 os.path.join(path1, path2, ...),不要手拼字符串;可正确处理不同系统的分隔符(Linux/macOS 为 /,Windows 为 \)。
  • 路径拆分:用 os.path.split(path),得到 (目录部分, 最后一级名),最后一级可能是目录名或文件名。
  • 扩展名:用 os.path.splitext(path),得到 (不含扩展名的路径, 扩展名),如 ('/path/to/file', '.txt')
  • 上述合并、拆分只对字符串操作,不要求路径在磁盘上真实存在。
功能函数
当前目录绝对路径os.path.abspath('.')
路径拼接os.path.join(dir, name)
创建目录os.mkdir(path)
删除空目录os.rmdir(path)
拆分路径os.path.split(path) → (目录, 最后一级)
取扩展名os.path.splitext(path) → (前缀, '.ext')
import os
os.path.abspath('.') # 当前目录绝对路径
os.path.join('/Users/michael', 'testdir')
os.mkdir('/Users/michael/testdir')
os.rmdir('/Users/michael/testdir')
os.path.split('/Users/michael/testdir/file.txt') # ('/Users/michael/testdir', 'file.txt')
os.path.splitext('/path/to/file.txt') # ('/path/to/file', '.txt')

4. 文件操作:重命名与删除

  • os.rename(old, new):重命名文件(或移动)。
  • os.remove(path):删除文件。
  • 复制文件os 模块没有复制函数(复制不是操作系统提供的单一系统调用);可用读写文件自己实现,或使用 shutil 模块。

5. shutil:复制等扩展功能

  • shutil.copyfile(src, dst):复制文件内容。
  • shutil 还提供拷贝目录、移动等实用函数,可视为 os 的补充

6. 列出与过滤文件

  • os.listdir(path):列出目录下的所有条目名(不递归),返回 list。
  • os.path.isdir(path):是否为目录。
  • os.path.isfile(path):是否为文件。
  • 结合列表推导可简洁过滤,例如只保留目录、只保留 .py 文件等。
# 当前目录下所有目录
[x for x in os.listdir('.') if os.path.isdir(x)]

# 当前目录下所有 .py 文件
[x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1] == '.py']

7. 小结

  • os:封装操作系统接口,包含 nameenvironmkdirrmdirrenameremovelistdir 等。
  • os.path:路径处理,如 abspathjoinsplitsplitextisdirisfile
  • shutil:补充文件/目录复制、移动等,如 copyfile

练习

  1. os 模块编写程序,实现类似 dir -l 的输出。
  2. 编写程序,在当前目录及所有子目录中查找文件名包含指定字符串的文件,并打印相对路径。