42 OS 模块

164次阅读
没有评论

共计 5377 个字符,预计需要花费 14 分钟才能阅读完成。

引入

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()
正文完
 
shawn
版权声明:本站原创文章,由 shawn 2023-06-16发表,共计5377字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)