Python-操作系统交互:os模块,shutil模块
0 前言
python提供了2个内置库os模块,shutil模块用于与操作系统交互
import os
import shutil
Python os模块包含普遍的操作系统功能。如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的
os模块不仅提供了新建文件、删除文件、查看文件属性的操作功能,还提供了对文件路径的操作功能。但是,对于移动、复制、打包、压缩、解压文件及文件夹等操作,os模块没有提供相关的函数,此时需要用到shutil模块
1 os模块(内置库)
1.1 在py文件运行cmd/shell命令
os模块 | 说明 |
---|---|
os.system(shell) | 运行shell命令,阻塞运行,会出现cmd黑窗口 |
os.popen(shell) | 运行shell命令,非阻塞运行 |
os.system(shell):
- 该函数返回命令执行结果的返回值,并不是返回命令的执行输出
- system()函数在执行过程中进行了以下三步操作: 1.fork一个子进程; 2.在子进程中调用exec函数去执行命令; 3.在父进程中调用wait(阻塞)去等待子进程结束
import os
ret = os.system(r'dir D:\6_SoftwareTest\Pandas')
print('ret = %s' %(ret))
结果:ret=0表示正确执行,print()
在cmd执行完后才会执行
驱动器 D 中的卷是 Data
卷的序列号是 4CD3-8813
D:\6_SoftwareTest\Pandas 的目录
2020/12/03 16:57 <DIR> .
2020/12/03 16:57 <DIR> ..
2020/12/18 09:53 <DIR> .idea
2020/09/27 10:58 9,047 ConfigurationData.xlsx
2020/12/03 16:37 161 pandasTest.py
2 个文件 9,208 字节
3 个目录 298,292,543,488 可用字节
ret = 0
os.popen(shell):
- 该函数返回新的管道,可以通过
read()
方法获得管道的执行结果 - popen() 创建一个管道,通过fork一个子进程,然后该子进程执行命令。该管道用于父子进程间通信。父进程要么从管道读信息,要么向管道写信息,至于是读还是写取决于父进程调用popen时传递的参数(w或r,默认r)
import os
ret = os.popen(r'dir D:\6_SoftwareTest\Pandas').read()
print('ret = %s' %(ret))
结果:ret是cmd执行结果
ret = 驱动器 D 中的卷是 Data
卷的序列号是 4CD3-8813
D:\6_SoftwareTest\Pandas 的目录
2020/12/03 16:57 <DIR> .
2020/12/03 16:57 <DIR> ..
2020/12/18 09:53 <DIR> .idea
2020/09/27 10:58 9,047 ConfigurationData.xlsx
2020/12/03 16:37 161 pandasTest.py
2 个文件 9,208 字节
3 个目录 298,292,543,488 可用字节
1.2 遍历文件和文件夹
os模块 | 说明 |
---|---|
os.popen('dir path') | 使用批处理命令 |
os.listdir(path) -> list of path of dir,file | 返回指定目录下的所有文件和目录名,返回列表 |
os.walk(path) -> Iter of tuple | 返回指定目录和子目录下的所有文件名,返回迭代器 |
批处理dir命令
推荐使用os.popen()
直接调用批处理指令dir
,批处理的功能已经非常完善
注意批处理返回的是纯文本
import os
ret = os.popen(r'dir /b /d /s D:\6_SoftwareTest\Pandas\*.xml').read()
print(ret)
结果:
D:\6_SoftwareTest\Pandas\.idea\misc.xml
D:\6_SoftwareTest\Pandas\.idea\modules.xml
D:\6_SoftwareTest\Pandas\.idea\workspace.xml
D:\6_SoftwareTest\Pandas\.idea\inspectionProfiles\profiles_settings.xml
os.walk(path)
os.walk()
的返回值是一个生成器(generator),每次遍历的对象都是返回的是一个三元元组(root, dirs, files)
root
所指的是当前正在遍历的这个文件夹的本身的地址dirs
是一个list,内容是该文件夹中所有的目录的名字(不包括子目录)files
同样是 list , 内容是该文件夹中所有的文件(不包括子目录)
函数会自动改变root
的值使得遍历所有的子文件夹。所以返回的三元元组的个数为所有子文件夹(包括子子文件夹,子子子文件夹等等)加上1(根文件夹)
import os
file_list = []
for root, dirs, files in os.walk(os.getcwd()):
for file in files:
file_list.append(os.path.join(root, file))
print(file_list)
结果为:
['F:\\SoftwareTest\\os\\osTest.py',
'F:\\SoftwareTest\\os\\.idea\\misc.xml',
'F:\\SoftwareTest\\os\\.idea\\modules.xml',
'F:\\SoftwareTest\\os\\.idea\\os.iml',
'F:\\SoftwareTest\\os\\.idea\\workspace.xml',
'F:\\SoftwareTest\\os\\.idea\\inspectionProfiles\\profiles_settings.xml']
1.3 文件操作
os模块 | 说明 |
---|---|
os.startfile(path) | 打开文件或目录,相当于Window双击 |
os.remove(path) | 删除一个文件或文件夹 |
os.system('path') | 执行一个文件 |
os.popen('path') | 执行一个文件 |
注意:
os.startfile(notepad.exe)
是Windows双击指令,让Windows创建一个子进程去打开文件,新文件和当前python脚本无关,互不干扰
os.system('notepad.exe')
是阻塞运行cmd命令,主进程打开新的窗口,原窗口进入休眠状态,待新的窗口关闭,主进程再重新唤醒原窗口。当打开一个持续执行的文件时,原程序会被锁住,且有CMD黑窗口
os.popen('notepad.exe')
是非阻塞运行cmd命令,主进程打开新的窗口,原窗口进入继续执行。注意,不能用在需要返回值的场合,因为原程序不会等返回值就会往下走
2 shutil模块(内置库)
2.1 文件操作
shutil模块 | 说明 |
---|---|
shutil.copy(src_file, dst_file) shutil.copy(src_file, dst_dir) | 如果目标是一个文件夹,那么它将在其中创建一个与源文件具有相同名称(基本名称)的新文件 |
shutil.move(src_file, dst_file) shutil.move(src_file, dst_dir) | 如果目标是一个文件夹,那么它将在其中创建一个与源文件具有相同名称(基本名称)的新文件 |