23、OS模块

Python模块 / 2020-12-10

4、系统相关模块OS

4.1、系统操作
4.1.1、获取当前路径
import os
>>> os.getcmd()  # 获取当前执行文件路径
'C:\\Users\\AERO\\AppData\\Local\\Programs\\Python\\Python38-32'
4.1.2、切换工作目录
>>> os.chdir(r'E:\Note\Python学习')  # 相当于shell的cd命令
>>> os.getcwd()
'E:\\Note\\Python学习'
4.1.3、创建单级目录
>>> os.mkdir('E:\\test')  # 相当于shell的mkdir
4.1.4、递归创建目录
>>> os.makedirs('E:\\test\\test2\\test3')  #相当于shell的mkdir -p命令
4.1.5、删除单个目录
>>> os.rmdir('E:\\test')  # 删除单个目录
4.1.6、递归删除目录
# 只有在目录为空时才可以删除,相当于shell的rm命令
>>> os.removedirs('E:\\test\\test2\\test3')
4.1.7、获取当前文件/目录信息
>>> os.stat('C:\\Users\\AERO\\AppData\\Local\\Programs\\Python\\Python38-32')
os.stat_result(st_mode=16895, st_ino=8162774324724976, st_dev=4066170135, st_nlink=1, st_uid=0, st_gid=0, st_size=4096, st_atime=1597116491, st_mtime=1594107071, st_ctime=1594107056)
4.1.8、显示指定目录
# 显示指定目录下属子文件及子目录,包括隐藏文件!
>>> os.listdir('E:\\test\\test2\\test3')
['hihi.txt', 'test4']
4.1.9、删除文件
>>> os.remove('E:\\test\\test2\\test3\\666.txt'
4.1.10、重命名文件
>>> os.rename('E:\\test\\test2\\test3\\haha.txt','E:\\test\\test2\\test3\\hihi.txt')
4.1.11、执行命令

发起系统调用,告诉系统运行字符串中指定的命令,务必记住所写命令与当前系统相对应!别把Linux命令写在Windows平台!

>>> os.system('ls')  #ls是Linux命令,Windows可没有,如果这个交互式窗口是在Windows运行,那就会报错!
package  seafile-server-7.1-ubuntu-amd64-http  test.sh	v2ray.sh  vpnsetup.sh
4.1.12、获取系统环境变量
>>> os.environ
environ({'SHELL': '/bin/bash', 'HISTSIZE': '3000', 'LANGUAGE': 'en_US.utf8:', 'HISTTIMEFORMAT': '%F %T ', 'PWD': '/home/ubuntu', 'LOGNAME': 'ubuntu', 'XDG_SESSION_TYPE': 'tty', 'MOTD_SHOWN': 'pam', 'HOME': '/home/ubuntu', 'LANG': 'en_US.utf8', 'PROMPT_COMMAND': 'history -a; ', 'SSH_CONNECTION': '113.110.116.101 54105 172.19.0.8 702', 'XDG_SESSION_CLASS': 'user', 'TERM': 'xterm', 'USER': 'ubuntu', 'DISPLAY': 'localhost:12.0', 'SHLVL': '1', 'XDG_SESSION_ID': '74214', 'XDG_RUNTIME_DIR': '/run/user/1000', 'SSH_CLIENT': '113.110.116.101 54105 702', 'XDG_DATA_DIRS': '/usr/local/share:/usr/share:/var/lib/snapd/desktop', 'PATH': '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin', 'DBUS_SESSION_BUS_ADDRESS': 'unix:path=/run/user/1000/bus', 'SSH_TTY': '/dev/pts/2', '_': '/usr/bin/python3'})
4.2、os.path路径系列
4.2.1、判断绝对路径
>>> print(os.path.isabs('/usr/bin/bash'))  #Linux以/为依据,Windows以盘符为依据
True
4.2.2、规范绝对路径
>>> print(os.path.abspath(r'Y:\\////////\\\\\\test\\\\\run.py'))
Y:\test\run.py
4.2.3、文件/目录最后访问时间
>>> print(os.path.getatime('E:\\v2rayN'))
1603271298.2711732  # 返回时间戳格式
4.2.4、文件/目录最后修改时间
>>> print(os.path.getmtime('E:\\v2rayN'))
1603271298.2711732
4.2.5、获取目标路径
>>> os.path.dirname('C:\\Windows\\System32\\drivers\\etc\\hosts')
'C:\\Windows\\System32\\drivers\\etc'
4.2.6、获取目标文件名
>>> os.path.basename('C:\\Windows\\System32\\drivers\\etc\\hosts')
'hosts'
4.2.7、文件/目录是否存在
>>> os.path.exists('C:\\Windows\\System32\\drivers\\etc\\hosts')
True

4.2.8、是否存在该文件

>>> os.path.isfile('C:\\Windows\\System32\\drivers\\etc\\hosts')
True
4.2.9、是否存在该目录
>>> os.path.isdir('C:\\Windows\\System32\\drivers\\etc\\hosts')  # hosts不是目录,是普通文件!
False
4.2.10、拼接路径
>>> os.path.join('E:\test', 'haha', 'hihi')  # 可以配合makedirs
'E:\test\\haha\\hihi'
4.2.11、统计文件大小
import os
from sys import exit


def size_decorator(func):  # 装饰器,添加容量单位!
    def size_format(path):
        __TB_BYTE__ = 13  # 常量
        __GB_BYTE__ = 10
        __MB_BYTE__ = 7
        __KB_BYTE__ = 4
        size = func(path)
        if len(str(size)) >= __TB_BYTE__:
            print(''.join([str(size // 1024**4), 'TB']))
        elif len(str(size)) >= __GB_BYTE__:
            print(''.join([str(size // 1024**3), 'GB']))
        elif len(str(size)) >= __MB_BYTE__:
            print(''.join([str(size // 1024**2), 'MB']))
        elif len(str(size)) >= __KB_BYTE__:
            print(''.join([str(size // 1024), 'KB']))
        else:
            print(''.join([str(size), 'bytes']))
    return size_format


@size_decorator
def folder_size(folder_path):  # 闭包内层递归函数,预防递归时被装饰器多次调用,解决装饰器与递归函数集成时被装饰多次的问题
    def _folder_size(_folder_path):  # 统计指定目录大小,返回整数值
        size = 0
        if os.path.isfile(_folder_path):  # 若为文件,计算并结束函数
            return os.path.getsize(_folder_path)
        if not os.path.isdir(_folder_path):  # 路径不正确
            print('路径有误!请输入正确的路径')
            exit()

        for folder_or_file in os.listdir(_folder_path):  # 若为目录,则函数递归
            son_dir = os.path.join(_folder_path, folder_or_file)
            if os.path.isdir(son_dir):
                size += _folder_size(son_dir)
            else:
                size += os.path.getsize(son_dir)
        return size
    return _folder_size(folder_path)


folder_size(r'E:\v2rayN')


# 执行得到结果
71MB

5、路径模块pathlib

Python3.5后,推出了新模块pathlib,用于处理路径相关!

5.1、获取上级目录
>>> import pathlib
>>> pathlib.Path('E:\\v2rayN\\v2rayN.exe').parent
WindowsPath('E:/v2rayN')
>>> pathlib.Path('E:\\v2rayN\\v2rayN.exe').parent.parent
WindowsPath('E:/')
5.2、拼接并规范化路径
v2ray_path = pathlib.Path('E:\\v2rayN') / 'sanxi//haha\\hihi'  # 使用/拼接
print(v2ray_path)
世间微尘里 独爱茶酒中