🍖OS 模块

引入

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()
原文地址:https://www.cnblogs.com/songhaixing/p/14138856.html