引入
1.什么是 OS 模块
- 操作系统接口模块
2.OS 模块的作用
- 该模块为Python自带的标准库模块
- 提供了一些方便使用操作系统相关功能的函数
3.什么是环境变量
- 一般是指在操作系统中用来指定操作系统运行环境的一些参数, 比如 : 临时文件夹位置和系统文件夹位置等
- 操作系统运行系统命令的时候, 会到这一系列文件夹中去找你输入的命令在不在里面
4.sys.path 与 os.environ
- sys.path环境变量 : 以列表的形式保存, 存的是一堆文件夹, python查找模块时会检索这个环境变量里的文件夹
- os.environ环境变量 : 是一个字典,一系列的键、值对存储在该字典中,系统环境信息全部存储在该字典中, 当你想让你这个值在整个环境中都能用的到, 你就可以把这个值往os.environ环境变量中添加
一. OS 系列
以下是 OS 的常用方法:
ps : "" 重点使用方法
方法 | 作用 |
---|---|
os.name | 指示你正在使用的工作平台, Windows为 'nt',Linux/Unix为 'posix' |
os.getcwd | 得到当前工作目录,即当前python脚本工作的目录路径 |
os.remove(file) | 删除一个文件 |
os.rename("oldname","newname") | 重命名文件/目录 |
os.stat(file) | 获得文件属性 |
os.mkdir(name) | 创建目录 |
os.makedirs('dirname1/dirname2') | 可生成多层递归目录 |
os.rmdir(name) | 删除目录 |
os.removedirs(r“c:\python”) | 若目录为空,则删除,并递归到上一级目录,若也为空,则删除,依此类推 |
os.system("bash command") | 运行shell命令, 直接显示 |
os.linesep | 给出当前平台的行终止符,Windows使用 '\r\n',Linux使用 '\n', Mac使用 '\r' |
os.listdir('dirname') | 返回指定目录下的所有文件和目录名, 包括隐藏文件,并以列表方式打印 |
os.walk(dir) | 用类似于深度遍历的方式遍历文件夹中的子文件夹以及文件,最基本的显示方式为(root_path,[file_dirs],[files]) |
os.curdir | 返回当前目录('.') |
os.chdir('dirname') | 改变工作目录到'dirname' |
os.pardir | 获取当前目录的父目录字符串名:('..') |
os.sep | 取代操作系统特定的路径分隔符, win下为"\", Linux下为"/" |
os.pathsep | 输出用于分割文件路径的字符串 win下为" ; " , Linux下为" :" |
os.environ | 获取系统环境变量 |
- os.environ 使用 (重点)
import os
print(os.environ) # environ({'ALLUSERSPROFILE': 'C:\\ProgramData', 'APPDATA': 'C:\\Users\\Administrator\\AppData\\Roaming', ....省略})
print(type(os.environ)) # <class 'os._Environ'>
# 向环境变量中设置值,取值
# 后期我们链接数据库的用户名密码,不写死到代码中,而是配置在环境变量中,使用代码获取
os.environ["NAME"] = "shawn"
name = os.environ.get("NAME")
print(name) # shawn
- os.walk( ) 的使用
import os
dir_path = os.walk("F:\Pycharm File\PycharmProjects\python正课\day14")
print(dir_path) # <generator object walk at 0x000001357D44AAC8> (拿到的是一个生成器)
我们对其循环取值
for i in dir_path:
print(i)
'''輸出
('F:\\Pycharm File\\PycharmProjects\\python正课\\day14', ['bbbb'], ['aaa.txt', '装饰器语法糖.py'])
('F:\\Pycharm File\\PycharmProjects\\python正课\\day14\\bbbb', [], ['.sss.txt', 'aaa.txt'])
'''
# 我们可以发现 os.walk() 以元组为单位区分每一层, 每一层又分为三个部分(根目录路径, 根目录下的文件夹列表, 根目录下的文件列表)
我们也可以将三个部分遍历出来分开查看
for root,dirs,files in dir_path:
print(root)
print(dirs)
print(files)
print("---------->")
'''输出
F:\Pycharm File\PycharmProjects\python正课\day14
['bbbb']
['aaa.txt', '装饰器语法糖.py']
---------->
F:\Pycharm File\PycharmProjects\python正课\day14\bbbb
[]
['.sss.txt', 'aaa.txt']
---------->
'''
计算一个文件夹的大小示例
import os
def dir_size():
while True:
dir_path = input("请输入文件夹路径(q退出)>>").strip()
size = 0 # 初始大小
if dir_path.lower() == "q":break
if not os.path.isdir(dir_path): # 判断是否存在该目录
print("没找到该文件夹,请重新输入")
continue
path_list = os.walk(dir_path) # 得到生成器
for root,dirs,files in path_list: # 遍历三个元素
for i in files: # 每次遍历取出文件
size += os.path.getsize(os.path.join(root,i)) # 拼接文件路径并计算大小
print(f"该目录总大小:{size}")
dir_size()
二. OS.path 系列
os.path 系列主要用于获取文件的属性, 以下是常用方法 :
ps : "" 重点使用方法
方法 | 作用 |
---|---|
os.path.abspath(path) | 返回规范化的绝对路径 (多个"\"只识别一个) |
os.path.basename(path) | 返回文件名 (如果传入的是路径,会切出文件名) |
os.path.dirname(path) | 返回文件路径 (就是当前文件或目录的上一级目录) |
os.path.exists(path) | 如果路径 path 存在,返回 True;如果路径 path 不存在,返回 False。 |
os.path.getatime(path) | 返回最近访问时间(浮点型, 有秒级) |
os.path.getmtime(path) | 返回最近文件修改时间 |
os.path.getctime(path) | 返回文件 path 创建时间 |
os.path.getsize(path) | 返回文件大小,如果文件不存在就返回错误 |
os.path.isabs(path) | 判断是否为绝对路径 |
os.path.isfile(path) | 判断路径是否为文件 |
os.path.isdir(path) | 判断路径是否为目录 |
os.path.join(path1, path2,path3) | 把目录和文件名拼接成一个路径 |
os.path.normcase(path) | 转换path的大小写和斜杠 (只在 windows 平台上有效) |
os.path.normpath(path) | 规范path字符串形式 |
os.path.split(path) | 把路径分割成 dirname 和 basename,返回一个元组 |
-
os.path.normcase( ) 说明
⛅Linux和Mac平台上, 该函数会原样返回path, 在Windows平台上会将路径中所有字符转换为小写, 并将所有斜杠转换成反斜杠
import os
res = os.path.normcase('C:/SHAWN///SOng\\\hai')
print(res) # c:\shawn\\\song\\hai
-
os.path.normpath( ) 说明
⛅规范路径, 并且会识别"..", 自动将其返回上一级, 分隔符会转成当前平台使用的分隔符
import os
res = os.path.normpath("C:///SHAWn\\song\../xing/")
print(res) # C:\SHAWn\xing
res2 = os.path.normpath("D:\\Shawn/song\hai/../..")
print(res2) # D:\Shawn (返回了两次)
三. OS 路径处理
1.方法一 (通用)
- 这种方法比较通用, Python2 和 Python3 中都适用
- 可以先使用 os.path.abspath( ) 规范一下返回路径
import os
print(os.path.abspath(__file__)) #F:\Pycharm File\PycharmProjects\python正课\day19\test.py
BASE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
print(BASE_DIR) # F:\Pycharm File\PycharmProjects\python正课 (返回上一级两次)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
print(BASE_DIR) # F:\Pycharm File\PycharmProjects\python正课 (返回上一级两次)
BASE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "../.."))
print(BASE_DIR) # F:\Pycharm File\PycharmProjects (返回上一级三次)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
print(BASE_DIR) # F:\Pycharm File\PycharmProjects (返回上一级三次)
2.方法二
- 使用比较简单
- op.pardir : 上一级
- op.path.normpath( ) : 规范path字符串形式
import OS
print(os.path.abspath(__file__)) #F:\Pycharm File\PycharmProjects\python正课\day19\test.py
BASE_DIR = os.path.normpath(os.path.join(__file__,os.pardir,os.pardir))
print(BASE_DIR) # F:\Pycharm File\PycharmProjects\python正课 (返回上一级两次)
BASE_DIR = os.path.normpath(os.path.join(__file__,os.pardir,".."))
print(BASE_DIR) # F:\Pycharm File\PycharmProjects\python正课 (返回上一级两次)
BASE_DIR = os.path.normpath(os.path.join(__file__,"..","..",".."))
print(BASE_DIR) # F:\Pycharm File\PycharmProjects (返回上一级三次)
四.灭霸程序
输入文件夹路径, 将该文件下和子文件夹下所有的文件随机删除一半
import os,random
def Baba():
while True:
dir_path = input("请输入实验文件夹(q退出)>>").strip()
file_list = []
if dir_path.lower() == "q":break
if not os.path.isdir(dir_path):
print("该路径不是一个文件夹, 请重新输入");continue
res = os.walk(dir_path)
for root, dirs, files in res:
for file in files:
file_list.append(os.path.join(root,file))
print(f"正在统计文件个数...\n该文件夹下共有:{len(file_list)}个文件")
y_n = input("你确定要启动灭霸程序吗?(y/任意n)>>").strip()
if not y_n.lower() == "y":continue
rm_path = random.sample(file_list,len(file_list)//2)
for i in rm_path:
file_list.remove(i);os.remove(i)
print(f"删除了文件:{i}")
print(f"该文件夹下剩余:{len(file_list)}个文件")
Baba()