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)