OS模块常用详解
OS模块是python标准库中用于访问操作系统功能的模块,使用OS模块 提供的接口可以实现跨平台访问。
通用操作:
1.获取平台信息,环境变量或进程等信息
2.目录和文件的操作
3.判断操作
1.系统操作
import os
# 获取系统的分隔符,Linux>>>"/"
print(os.sep)
# work platform linux >>> posix
print(os.name)
# 读取环境变量
print(os.getenv('env_name'))
print(os.environ)
# environ({'PATH': '/home/ubuntu/.virtualenvs/py37/bin:/home/ubuntu/.local/bin:/opt/jdk-11/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin', 'XAUTHORITY': '/run/user/1000/gdm/Xauthority', 'XMODIFIERS': '@im=fcitx', 'XDG_DATA_DIRS': '/usr/share/ubuntu:/usr/local/share/:/usr/share/:/var/lib/snapd/desktop', 'GDMSESSION': 'ubuntu', 'TEXTDOMAINDIR': '/usr/share/locale/', 'GTK_IM_MODULE': 'fcitx', 'DBUS_SESSION_BUS_ADDRESS': 'unix:path=/run/user/1000/bus', 'PS1': '(py37) ', 'XDG_CURRENT_DESKTOP': 'ubuntu:GNOME', 'SSH_AGENT_PID': '1593', 'QT4_IM_MODULE': 'fcitx', 'SESSION_MANAGER': 'local/ubuntu:@/tmp/.ICE-unix/1469,unix/ubuntu:/tmp/.ICE-unix/1469', 'USERNAME': 'ubuntu', 'LOGNAME': 'ubuntu', 'PWD': '/home/ubuntu/workspace/skyguard/wordcloud/os模块', 'IM_CONFIG_PHASE': '2', 'PYCHARM_HOSTED': '1', 'GJS_DEBUG_TOPICS': 'JS ERROR;JS LOG', 'PYTHONPATH': '/home/ubuntu/workspace/skyguard/wordcloud', 'SHELL': '/bin/bash', 'GIO_LAUNCHED_DESKTOP_FILE': '/usr/share/applications/jetbrains-pycharm-ce.desktop', 'OLDPWD': '/opt/pycharm-community-2020.2.2/bin', 'GNOME_DESKTOP_SESSION_ID': 'this-is-deprecated', 'GTK_MODULES': 'gail:atk-bridge', 'VIRTUAL_ENV': '/home/ubuntu/.virtualenvs/py37', 'CLUTTER_IM_MODULE': 'xim', 'TEXTDOMAIN': 'im-config', 'XDG_SESSION_DESKTOP': 'ubuntu', 'SHLVL': '0', 'QT_IM_MODULE': 'fcitx', 'JAVA_HOME': '/opt/jdk-11', 'XDG_CONFIG_DIRS': '/etc/xdg/xdg-ubuntu:/etc/xdg', 'LANG': 'en_US.UTF-8', 'XDG_SESSION_ID': '1', 'XDG_SESSION_TYPE': 'x11', 'DISPLAY': ':0', 'PYTHONIOENCODING': 'UTF-8', 'GPG_AGENT_INFO': '/run/user/1000/gnupg/S.gpg-agent:0:1', 'DESKTOP_SESSION': 'ubuntu', 'USER': 'ubuntu', 'XDG_MENU_PREFIX': 'gnome-', 'GIO_LAUNCHED_DESKTOP_FILE_PID': '3342', 'QT_ACCESSIBILITY': '1', 'WINDOWPATH': '1', 'GJS_DEBUG_OUTPUT': 'stderr', 'SSH_AUTH_SOCK': '/run/user/1000/keyring/ssh', 'XDG_SEAT': 'seat0', 'PYTHONUNBUFFERED': '1', 'GNOME_SHELL_SESSION_MODE': 'ubuntu', 'XDG_VTNR': '1', 'XDG_RUNTIME_DIR': '/run/user/1000', 'HOME': '/home/ubuntu'})
# 获取当前路径
print(os.getcwd())
# /home/ubuntu/workspace/skyguard/wordcloud/os模块
# system info
print(os.uname())
# posix.uname_result(sysname='Linux', nodename='ubuntu', release='5.4.0-58-generic', version='#64~18.04.1-Ubuntu SMP Wed Dec 9 17:11:11 UTC 2020', machine='x86_64')
print(os.uname().sysname)
# Linux
print(os.uname().nodename)
# ubuntu
print(os.uname().release)
# 5.4.0-58-generic
print(os.uname().version)
# #64~18.04.1-Ubuntu SMP Wed Dec 9 17:11:11 UTC 2020
os.system("cmd options")
# 类似于直接在终端执行命令,成功返回0,但有时不会得到预料结果,有多个命令最好隔开执行,
# e.g. os.system("cd /home && touch aaaa") 或者 os.system("cd /home; touch aaaa")
os.system("mkdir hahahah")
# 当前目录下创建目录
2.目录操作
# 目录的CRUD
# 查看 R
# print(os.listdir("."))
# # ['test.txt', 'os_demo01.py'] 当前目录下的文件或目录
# print(os.listdir(".."))
# # 上一级目录下的文件或目录
# os.getcwd()
# 返回当前进程目录
#
# # 创建目录 C
# # 只创建一个目录,已经存在则失败
# print(os.mkdir("./test")) # None
# # 当前目录下创建名为“test”的目录
# # 递归创建目录,已经存在则失败
# print(os.makedirs('test1/test2/test3')) # None
#
# # 更改命名,文件或目录 U
# os.rename("test.txt", "testNew.txt")
# os.rename("test1", "test1New")
#
# # 删除目录,如有文件则失败 D
# os.rmdir("test")
# os.removedirs("test1New")
# 改变当前目录,到指定目录
# os.chdir('../')
3.文件操作
# 文件的CRUD
# 获取文件大小
print(os.path.getsize('os_demo01.py'))
# 新建文件 C
# f = open("test",'w')
# f.close()
# rename a file U
os.rename('creatTestNew', 'creatTestNew1')
# remove file D
os.remove('creatTestNew1')
# read file R
# ref file operation
f = open('test', 'r')
f.read()
f.readline()
f.close()
print( os.path.getatime(file) ) # 输出最近访问时间
print( os.path.getctime(file) ) # 输出文件创建时间
print( os.path.getmtime(file) ) # 输出最近修改时间
分离文件后缀 & 遍历
# split file and post
print(os.path.splitext('testNew.txt'))
# ('testNew', '.txt')
# 目录名和文件名分离
print(os.path.split('/tmp/hello/python.jpg'))
# ('/tmp/hello', 'python.jpg')
# 遍历目录
for root,dir,files in os.walk('/var/log'):
print(root)
print(files)
print(dir)
for name in files:
print(join(root,name))
# 遍历文件
from collections import Iterable
f = open('/mnt/test')
print(isinstance(f,Iterable))
for i,item in enumerate(f):
if i == 10:
break
print(i,item)
4.路径操作
# 文件路径
# 判断是否为绝对路径
print(os.path.isabs("test.txt")) # False
print(os.path.isabs("/home/ubuntu/workspace/skyguard/wordcloud/os模块/test.txt")) # True
# 生成绝对路径
print(os.path.abspath("test.txt"))
# /home/ubuntu/workspace/skyguard/wordcloud/os模块/test.txt
# 指定绝对路径拼接,但不会判断是否有这个绝对路径
print(os.path.join("test/test", "test.txt"))
# test/test/test.txt
# 获取文件名或目录名
filename = "/home/ubuntu/workspace/skyguard/test.txt"
print(os.path.basename(filename))
# test.txt 获取文件名
print(os.path.dirname(filename))
# /home/ubuntu/workspace/skyguard 获取目录名
5.常用判断及权限操作
判断
# 判断文件或目录是否存在
print(os.path.exists('data1.txt'))
# True or False
# 判断是否为绝对路径
os.path.isabs(path)
# 判断路径是否为文件
os.path.isfile(path)
# 判断路径是否为目录
os.path.isdir(path)
权限
# 更改文件或目录的权限
os.chmod(path, mode)
# path -- 文件名路径或目录路径。
# flags -- 可用以下选项按位或操作生成, 目录的读权限表示可以获取目录里文件名列表, ,执行权限表示可以把工作目录切换到此目录 ,删除添加目录里的文件必须同时有写和执行权限 ,文件权限以用户id->组id->其它顺序检验,最先匹配的允许或禁止权限被应用。
***
stat.S_IXOTH: 其他用户有执行权0o001
stat.S_IWOTH: 其他用户有写权限0o002
stat.S_IROTH: 其他用户有读权限0o004
stat.S_IRWXO: 其他用户有全部权限(权限掩码)0o007
stat.S_IXGRP: 组用户有执行权限0o010
stat.S_IWGRP: 组用户有写权限0o020
stat.S_IRGRP: 组用户有读权限0o040
stat.S_IRWXG: 组用户有全部权限(权限掩码)0o070
stat.S_IXUSR: 拥有者具有执行权限0o100
stat.S_IWUSR: 拥有者具有写权限0o200
stat.S_IRUSR: 拥有者具有读权限0o400
stat.S_IRWXU: 拥有者有全部权限(权限掩码)0o700
stat.S_ISVTX: 目录里文件目录只有拥有者才可删除更改0o1000
stat.S_ISGID: 执行此文件其进程有效组为文件所在组0o2000
stat.S_ISUID: 执行此文件其进程有效用户为文件所有者0o4000
stat.S_IREAD: windows下设为只读
stat.S_IWRITE: windows下取消只读
***
# 假定 /tmp/foo.txt 文件存在,设置文件可以通过用户组执行
os.chmod("/tmp/foo.txt", stat.S_IXGRP)
# 设置文件可以被其他用户写入
os.chmod("/tmp/foo.txt", stat.S_IWOTH)