Python基础学习之 os 模块详解
os模块的作用可以分为三类:路径操作,文件操作,其他操作;
1. 路径操作
1.1 os.chdir(),切换当前工作目录;
os.chdir(r'D:\测试文件夹') # 将工作目录切换为:D:\测试文件夹1.2 os.getcwd(),返回工作目录路径;
print(os.getcwd()) # 输出:D:\PY_useful\3_python 基础,就是当前.py文件所在的位置; os.chdir(r'D:\测试文件夹') # 切换工作目录 print(os.getcwd()) # 返回当前程序所在的路径 输出:D:\测试文件夹;1.3 os.mkdir() & os.makedirs(),创建目录;
os.mkdir() :创建目录,只可以一级一级的创建目录; os.makedirs() :创建多级目录,即前一级的文件夹不存在,也可以创建;
os.mkdir(r'D:\PY_useful\python建目录') # 创建目录,只可以一级一级的创建目录,前提是 D:\PY_useful\ 已经存在,不然会报错;作用是:可以防止创建双层或者多层错误路径; # 如果PY_useful 文件夹不存在,则会报错; os.makedirs(r'D:\PY_useful\python建目录\一级\二级') # 创建多级目录,即前一级的文件夹不存在,也不会报错;哪怕中间目录不存在也能正常的创建;1.4 os.rmdir() & os.rmdirs(),删除目录;
os.rmdir()(r'D:\PY_useful\python建目录')# 删除目录 os.rmdirs(r'D:\PY_useful\python建目录\一级\二级') # 删除多级目录1.5 os.listdir(path=...) ,返回指定文件夹下所有的文件和文件夹
使用 os.listdir(path=...) ,可以查看一层的内容;举例如下:
os.listdir(path=r'D:\测试文件夹') # ['一层文件.txt', '一层文件2.txt', '一层文件夹']1.6 os.walk(path=...) ,遍历目录,返回一个元组 (root,dirs,files);
每次遍历的对象都是返回的是一个三元组(root,dirs,files),其中:
os.walk(path=...) 一般的用法如下:
for root, dirs, files in os.walk(r'D:\测试文件夹'): print('当前文件夹:' + root) # 返回当前的文件夹地址; print('本层包含的文件夹:') for name in dirs: # 遍历文件夹中的文件夹; print(os.path.join(root, name)) # 利用os.path.join(root, name),返回一个完整的文件夹路径; print('本层包含的文件:') for name in files: # 遍历文件夹中的文件; print(os.path.join(root, name)) # 利用os.path.join(root, name),返回一个完整的文件路径; print('') # 循环一次则输出一个空行;方便区分;本章内容中的文件夹结构;参考上图
输出:
当前文件夹:D:\测试文件夹 本层包含的文件夹: D:\测试文件夹\一层文件夹 本层包含的文件: D:\测试文件夹\一层文件.txt D:\测试文件夹\一层文件2.txt 当前文件夹:D:\测试文件夹\一层文件夹 本层包含的文件夹: D:\测试文件夹\一层文件夹\二层文件夹 D:\测试文件夹\一层文件夹\二层文件夹--2 本层包含的文件: D:\测试文件夹\一层文件夹\二层文件.txt D:\测试文件夹\一层文件夹\二层文件2.txt 当前文件夹:D:\测试文件夹\一层文件夹\二层文件夹 本层包含的文件夹: D:\测试文件夹\一层文件夹\二层文件夹\三层文件夹 本层包含的文件: D:\测试文件夹\一层文件夹\二层文件夹\三层文件.txt 当前文件夹:D:\测试文件夹\一层文件夹\二层文件夹\三层文件夹 本层包含的文件夹: 本层包含的文件: 当前文件夹:D:\测试文件夹\一层文件夹\二层文件夹--2 本层包含的文件夹: 本层包含的文件: D:\测试文件夹\一层文件夹\二层文件夹--2\三层文件----2.txt1.7 os.path.isdir(), 判断是否为目录;
print(os.path.isdir('D:\测试文件夹\一层文件夹\二层文件夹')) # 是文件夹,则输出:True print(os.path.isdir('D:\测试文件夹\一层文件.txt')) # 不是文件夹,则输出:False1.8 os.path.isabs(path),判断是否为绝对路径;
os.path.isabs('D:\测试文件夹\一层文件夹\二层文件夹') # 是绝对路径,则输出:True1.9 os.rename(src, dst),修改文件夹名称;
其中:src – 要修改的目录名;dst – 修改后的目录名;举例如下:
os.rename('D:\测试文件夹\一层文件夹','D:\测试文件夹\一层文件夹_改') # 执行语句后,文件夹名称变为:一层文件夹_改;2. 文件操作
2.1 os.remove(path) ,删除一个文件
os.remove('D:\测试文件夹\一层文件.txt') # 删除文件;2.2 os.path.abspath(),返回文件的绝对路径
2.3 os.path.join(),路径拼接;非常常用的函数,必须要熟练掌握;
连接两个或更多的路径名组件,在前面的 1.6 中已经使用;注意以下三点:
2.4 os.path.dirname(path),去掉文件名,返回目录
a = os.path.dirname('D:\测试文件夹\一层文件夹\二层文件夹--2\三层文件----2.txt') print(a) # 输出: D:\测试文件夹\一层文件夹\二层文件夹--22.5 os.path.splitext(),将扩展名与前面的路径分开;返回元组类型;
# os.path.splitext() a = os.path.splitext('D:\测试文件夹\一层文件夹\二层文件夹\三层文件.txt') print(a) # 输出元组:('D:\\测试文件夹\\一层文件夹\\二层文件夹\\三层文件', '.txt') print(a[0]) # 输出:D:\测试文件夹\一层文件夹\二层文件夹\三层文件 print(a[1]) # 输出:.txt2.6 os.path.basename(),返回文件名;
a = os.path.basename('D:\测试文件夹\一层文件夹\二层文件夹\三层文件.txt') print(a) # 三层文件.txt2.7 os.path.exists(),检查字符串是不是路径;返回布尔类型;
是路径,则返回True, 否则返回False;
a = os.path.exists('D:\测试文件夹\一层文件夹\二层文件夹\三层文件.txt') print(a) # True2.8 os.path.isfile(),检查字符串是不是文件;返回布尔类型;
# os.path.isfile() a = os.path.isfile('D:\测试文件夹\一层文件夹\二层文件夹\三层文件.txt') print(a)2.9 os.path.getsize(),返回文件大小;
# os.path.getsize() a= os.path.getsize('D:\测试文件夹\一层文件夹\二层文件夹\三层文件.txt') print(a)2.10 os.open() & os.close(),文件读取和关闭;
这里的两个方法,不常用;打开文件一般使用 open() 方法;
os.open() # 用于文件读取; os.close() # 用于文件关闭;2.11 os.path.getatime() & os.path.getmtime() , 文件的最后存取时间 & 最后修改时间;
import time a = os.path.getatime('D:\测试文件夹\一层文件夹\二层文件夹\三层文件.txt') # 返回path所指向的文件或者目录的最后存取时间,得到的是时间戳 print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(a))) # 将时间戳变为格式化字符串;输出:2020-09-25 11:06:21 a=os.path.getmtime('D:\测试文件夹\一层文件夹\二层文件夹\三层文件.txt') # 返回path所指向的文件或者目录的最后修改时间,得到的是时间戳 print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(a))) # 将时间戳变为格式化字符串;输出:2020-09-25 11:06:21上面时间戳变为可视化字符串的方法,可以参考:Python基础学习之时间模块 time模块 datetime模块
3. 其他操作
3.1 os.system(command) , 相当于执行对应指令(command)
os.system(r'D:\print_fun.py') # 执行对应地址的.py 文件,在定期运行程序时,会经常用到这个方法;3.2 os.name,可以得到操作系统的类型;
只有三个返回值,分别为:posix , nt , java, 对应linux / windows / java虚拟机
os.name # 输出:nt;3.3 os.sep,可以得到操作系统特定的路径分隔符;
Windows 系统分隔符为:\ ; Linux 系统分隔符为:/ ;当程序需要在不同系统运行时,通常会用到该属性;
os.sep # 输出:\; 操作系统特定的路径分隔符,Linux 系统返回 /, Windows 返回 \;3.4 os.linesep,可以可到操作系统的行终止符;
不同系统的终止符:Windows使用 '\r\n',Linux使用 '\n' , Mac使用 '\r' 。
os.linesep # 字符串给出当前平台使用的行终止符。4. 实例
4.1 固定时间运行程序
每隔10分钟,运行一次程序;
import time,os def sleep_time(hour,min,sec): return hour * 3600 + min * 30 +sec sleep = sleep_time(0,10,0) while True: time.sleep(sleep) print('开始执行;') print('现在时间为:' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(a))) os.system(r'D:\print_fun.py') print('执行完成;')每天早上 7:00 运行程序;
import time, os while True: time_now = time.strftime("%H:%M", time.localtime()) if time_now == '07:00': print('开始执行;') print('现在时间为:' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) os.system(r'D:\print_fun.py') print('执行完成;') time.sleep(60) # 因为我们是以分钟作为匹配值的,所以程序运行后,延时60s,确保程序不重复执行;4.2 寻找文件中的特定字符
寻找制定文件夹下(这里是:测试文件夹)下,Excel 文件内容包含字符串 '小可爱' 的文件,并打印出文件名 & sheet 名;
备注:测试文件夹的目录见上图,其中两个excel 文件的sheet1 & sheet2 均写了字符串如下字符串,参考下图:
import re import pandas as pd def func(folder_dir=r'',file_name=''): ''' :param folder_dir: 需要被寻找的文件夹路径 :param file_name: 被寻找的特殊字段,必须是xlsx文件 :return: 打印出特殊字段所在的文件路径 ''' xmlRegex = re.compile(r'.*?.(xlsx|xls)', re.I) # oldDocDir=folder_dir os.chdir(oldDocDir) for foldername, subfolders, filenames in os.walk(oldDocDir): for filename in filenames: # absdir = os.path.abspath('.') if xmlRegex.findall(str(filename)): try: oldName = os.path.join(foldername, filename) info = pd.read_excel(oldName, sheet_name=None) # sheet_name = None 则会读所有的sheet; for key,value in info.items(): if file_name in value.to_string(): print(file_name,'在文件:',oldName,end=' ') print('的',key,'中') except : print(oldName,'--> 这个文件我读不了呀~~请注意!') func(r'D:\测试文件夹',r'小可爱') # 调用函数,传入两个参数:需要寻找的目录 & 需要寻找的字符;输出: 我们可以看到,两个文件中的四个 '小可爱' 都被找到了;在日常工作中,这可以大大节省时间,提高工作效率;
小可爱 在文件: D:\测试文件夹\一层文件夹\二层文件.xlsx 的: Sheet1 中 小可爱 在文件: D:\测试文件夹\一层文件夹\二层文件.xlsx 的: Sheet2 中 小可爱 在文件: D:\测试文件夹\一层文件夹\二层文件夹\三层文件夹\四层文件.xlsx 的: Sheet1 中 小可爱 在文件: D:\测试文件夹\一层文件夹\二层文件夹\三层文件夹\四层文件.xlsx 的: Sheet2 中