6.4.1 标准库 os、os.path 与 shutil 简介

时间:2021-09-13 23:15:36

  os模块除了提供使用操作系统功能和访问文件系统的简便方法之外,还提供了大量文件与文件夹操作的方法,如下表所示。

方法 功能说明
access(path,mode) 按照 mode 指定的权限访问文件
chdir(path) 把 path 设置为当前工作目录
chmod(path,mode,*,dir_fd=None,follow_symlinks=True) 改变文件的访问权限
extsep 当前操作系统所使用的文件扩展名分隔符
fstat(path) 返回打开的文件的所有属性
get_exec_path() 返回可执行文件的搜索路径
getcwd() 返回当前的工作目录
listdir(path) 返回path目录下的文件和目录列表
mkdir(path[,mode=0777]) 创建目录
makedirs(path1/path2/...,mode=551) 创建多级目录
open(path,flags,mode=0o777,*,dir_fd=None) 按照mode指定的权限打开文件,默认权限为可读、可写、可执行
rmdir(path) 删除目录,目录中不能有文件或子文件夹
remove(path) 删除指定的文件
removedirs(path1/path2...) 删除多级目录,目录中不能有文件
rename(src,dst) 重命名文件或目录,可实现文件的移动
scandir(path='.') 返回包含指定文件夹中所有DirEntry对象的迭代对象
sep 当前操作系统所使用的路径分隔符
startfile(filepath[,operation]) 使用关联的应用程序打开指定文件或启动指定应用程序
stat(path) 返回文件的所有属性
truncate(path,length) 将文件截断,只保留指定的长度
walk(top,topdown=True,onerror=None) 遍历目录树,该方法返回一个元组,包含3个元素:所有路径名、所有目录列表与文件列表
write(fd,data) 将 bytes 对象 data 写入文件fd

 

  os.path模块提供了大量用于路径判断、切分、连接以及文件夹遍历的方法,如下表所示。

方法 功能说明
abspath(path) 返回给定路径的绝对路径
basename(path) 返回指定路径的最后一个组成部分
commonpath(paths) 返回戈丁的多个路径的最长公共路径
commonprefix(paths) 返回给定的多个路径的最长公共前缀
dirname(p) 返回给定路径的文件夹部分
exists(path) 判断文件是否存在
getatime(filename) 返回文件的最后访问时间
getctime(filename) 返回文件的最后创建时间
getmtime(filename) 返回文件的最后修改时间
getsize(filename) 返回文件的大小
isabs(path) 判断path是否为绝对路径
isdir(path) 判断path是否为文件夹
isfile(path) 判断path是否为文件
join(path,* paths) 连接两个或多个path
split(path) 对绝对路径进行分割,以列表形式返回
splitest(path) 从路径中分隔文件的扩展名
splitdrive(path) 从路径中分隔出驱动器的名称

 

  shutil模块也提供了大量的方法支持文件和文件夹的操作,常用方法如下表所示。

方法 功能说明
copyfile(src,dst) 复制文件
copytree(src,dst) 递归复制文件夹
disk_usage(path) 查看磁盘使用情况
move(src,dst) 移动文件或递归移动文件夹
rmtree(path) 递归删除文件夹
make_archive(base_name,format,root_dir=None,base_dir=None) 创建tar或zip格式的压缩文件
unpack_archive(filename,extract_dir = None,format = None) 解压缩文件

 

  下面通过几个示例来演示os、os.path 以及 shutil 模块的基本用法。

 1 import os  2 import os.path as op  3 
 4 print(op.basename(r'C:\windows\notepad.exe'))   #获取路径的最后一个组成部分
 5 #notepad.exe
 6 
 7 print(op.exists(r'test1.txt'))                  #测试文件是否存在
 8 #notepad.exe
 9 
10 #----------------------------------------------
11 #os.rename(r'C:\test1.txt',r'C:\test2.txt') #源文件不存在,重命名失败
12 '''
13 Traceback (most recent call last): 14  File "C:/Users/dddd/AppData/Local/Programs/Python/Python35/test1.py", line 10, in <module> 15  os.rename(r'C:\test1.txt',r'C:\test2.txt') #源文件不存在,重命名失败 16 FileNotFoundError: [WinError 2] 系统找不到指定的文件。: 'C:\\test1.txt' -> 'C:\\test2.txt' 17 '''
18 #----------------------------------------------
19 
20 #os.rename(r'C:\Users\dddd\AppData\Local\Programs\Python\Python35\infomation.txt','C:\\infomation.txt') #os.rename() 可实现文件的改名和移动
21 #这里区分是移动还是改名就看是不是在同一个路径下,是则为改名,否则为移动
22 
23 print(op.exists('C:\\infomation.txt')) 24 #True
25 
26 #返回路径的文件夹名
27 path = r'D:\mypython_exp\new_test.txt'
28 print(os.path.dirname(path))            #D:\mypython_exp
29 
30 #返回文件名
31 print(os.path.basename(path))           #new_test.txt
32 
33 #切分文件路径和文件名
34 print(os.path.split(path))              #('D:\\mypython_exp', 'new_test.txt')
35 
36 print(os.path.splitdrive(path))         #('D:', '\\mypython_exp\\new_test.txt')
37 
38 #切分文件拓展名
39 print(os.path.splitext(path))           #('D:\\mypython_exp\\new_test', '.txt')
40 
41 #获取当前工作目录下的 拓展名为.py的文件
42 print([fname for fname in os.listdir(os.getcwd()) if os.path.isfile(fname) and fname.endswith('.py')]) 43 #['BinaryTree.py', 'demo.py', 'demo_new.py', 'MyArray.py', 'myQueue.py', 'simNumpyArray.py', 'Stack.py', 'test.py', 'test1.py']
44 
45 #返回当前工作目录
46 print(os.getcwd())   #C:\Users\...\Programs\Python\Python35
47 
48 #在当前工作目录下创建子目录
49 #print(os.mkdir(os.getcwd() + r'\pyfile'))
50 
51 #把当前工作目录切换到pyfile目录下
52 os.chdir(os.getcwd() + r'\pyfile') 53 
54 #返回\pyfile目录下的文件
55 print(os.listdir(os.getcwd()))    #因为这个目录刚创建,还没有文件,所以返回空列表 []
56 
57 #当前目录还可以用 . 表示 上级目录可以用 .. 表示,,这是相对路径
58 print(os.listdir('.'))     #[]
59 print(os.listdir('..'))    #['.idea', 'BinaryTree.py', ...,]
60 
61 #在 pyfile目录下再创建一个目录
62 #os.mkdir('aa')
63 
64 #删除刚才创建的目录
65 #os.rmdir('aa')
66 
67 
68 print(os.path.commonpath([r'C:\windows\notepad.exe',r'C:\windows\system']))     #C:\windows
69 print(os.path.commonprefix([r'a\b\c\d',r'a\b\c\e']))                            #a\b\c\
1 import shutil 2 
3 #shutil.copyfile(r'C:\infomation.txt','C:\\Users\\dddd\\AppData\\Local\\Programs\\Python\\Python35\infomation.txt') #OK了,复制过来了
4 
5 #将某个文件夹及该文件夹中所有文件压缩至 当前目录下的 a.zip
6 #shutil.make_archive('.\\a','zip','.','a') #OK了,压缩成功了。
7 
8 #将刚才的压缩文件解压至 .\aa文件夹下
9 shutil.unpack_archive('.\a.zip','.\aa')