您现在的位置是:首页 >技术杂谈 >Python系列模块之标准库OS详解网站首页技术杂谈
Python系列模块之标准库OS详解
感谢点赞和关注 ,每天进步一点点!加油!
目录
一、模块
1.1 模块的定义
Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。
- 模块让你能够有逻辑地组织你的 Python 代码段。
- 相关的代码分配到一个模块里能让你的代码更好用,更易懂。
- 模块能定义函数,类和变量,模块里也能包含可执行的代码。
1.2 模块的分类
模块分为
- 标准库(python自带的模块,可以直接调用)
- 开源模块(第三方模块,需要先pip安装,再调用)
- 自定义模块(自己定义的模块)
模块存放的路径(RPM安装Python):
1.3 模块的基本导入语法
from modname import * # from导入模块文件里的所有函数
from modname import name1[, name2[, ... nameN]] # from导入模块文件里的部分函数
二、Python中的包
包是一个分层次的文件目录结构,它定义了一个由模块及子包,和子包下的子包等组成的 Python 的应用环境。
简单来说,包就是文件夹,但该文件夹下必须存在 __init__.py 文件, 该文件的内容可以为空。__init__.py 用于标识当前文件夹是一个包。
在 package_runoob 目录下定义 runoob1.py、runoob2.py、__init__.py 文件,test.py 为测试调用包的代码,目录结构如下:
package_runoob/runoob1.py
def runoob1():
print("I'm in runoob1")
package_runoob/runoob2.py
def runoob2():
print("I'm in runoob2")
package_runoob/__init__.py
# 通级目录 用 . 导入
from . import runoob1
from . import runoob2
print('package_runoob 初始化')
然后我们在 package_runoob 同级目录下创建 test.py 来调用 package_runoob 包
test.py
# 导入package包
from package_runoob.runoob2 import runoob2
from package_runoob.runoob1 import runoob1
runoob1()
runoob2()
执行结果:
三、标准库之os模块
os 模块提供了非常丰富的方法用来处理文件和目录。大概操作分为以下 5 类:
- 查看目录与切换目录
- 查看文件状态
- 文件路径相关操作
- 判断相关操作
- 文件改名与删除,目录创建与删除
示例: 查看目录与切换目录等
import os
print(os.getcwd()) # 查看当前目录
os.chdir("/tmp") # 改变当前目录
print(os.curdir) # 打印当前目录.
print(os.pardir) # 打印上级目录..
os.chdir(os.pardir) # 切换到上级目录
print(os.listdir("/")) # 列出目录里的文件,结果是相对路径,并且为list类型
执行结果:
示例: 查看文件状态
import os
print(os.stat("/root/data01.txt")) # 得到文件的状态信息,结果为一个tuple类型
print(os.stat("/root/data01.txt")[6]) # 得到状态信息(tuple)的第7个元素,也就是得到大小
print(os.stat("/root/data01.txt")[-4]) # 得到状态信息(tuple)的倒数第4个元素,也就是得到大小
print(os.stat("/root/data01.txt").st_size) # 用这个方法也可以得到文件的大小
print(os.path.getsize(__file__)) # 得到文件的大小,__file__是特殊变量,代表程序文件自己
print(os.path.getsize("/root/data01.txt")) # 也可以指定想得到大小的任意文件
执行结果:
示例: 文件路径相关操作
import os
print(os.path.abspath(__file__)) # 得到文件的绝对路径
print(os.path.dirname("/root/data01.txt")) # 得到文件的绝对路径的目录名,不包括文件
print(os.path.basename("/root/data01.txt")) # 得到文件的文件名,不包括目录
print(os.path.split("/root/data01.txt")) # 把dirname和basename分开,结果为tuple类型
print(os.path.join("/root","data01.txt")) # 把dirname和basename合并
执行结果:
示例: 判断相关操作
import os
print("判断 是否 为 文件: ",os.path.isfile("/root/data01.txt")) # 判断是否为文件,结果为bool类型
print("判断是否为绝对路径: ",os.path.isabs("1.txt")) # 判断是否为绝对路径,结果为bool类型
print("判断 是 否 存 在: ",os.path.exists("/tmp/11.txt")) # 判断是否存在,结果为bool类型
print("判断 是否 为 目 录: ",os.path.isdir("/tmp/")) # 判断是否为目录,结果为bool类型
print("判断是否为链接文件: ",os.path.islink("/etc/rc.local")) # 判断是否为链接文件,结果为bool类型
执行结果:
示例: 文件改名与删除,目录创建与删除等
import os
os.rename("/tmp/1.txt","/tmp/11.txt") # 改名
#os.remove("/tmp/11.txt") # 删除
os.mkdir("/tmp/aaa") # 创建目录
#os.rmdir("/tmp/aaa") # 删除目录
os.makedirs("/tmp/a/b/c/d") # 连续创建多级目录
#os.removedirs("/tmp/a/b/c/d") # 从内到外一级一级的删除空目录,目录非空则不删除
执行结果:
os.popen()和os.system()可以直接调用linux里的命令
# 下面这两句执行操作都可以成功
os.popen("touch /tmp/222")
os.system("touch /tmp/333")
执行结果:
实战: 钉钉告警应用
需求:文本内容使用 钉钉告警发送出来
说明: 告警文件内容 放在 python脚本 路径下的 /tmp/text ,告警内容我们可以自身需求定义。Python 使用Linux 自带的 2.7.5 版本。
msg.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import requests
import json
import sys
import os
headers = {'Content-Type': 'application/json;charset=utf-8'}
# 当前路径
path=sys.path[0]
def msg(text,api_url):
json_text= {
"msgtype": "text",
"text": {
"content": text
},"at": {
"atMobiles": ["1786001xxxx"]
}
}
print requests.post(api_url,json.dumps(json_text),headers=headers).content
if __name__ == '__main__':
f = open(path + "/tmp/text", "r")
line = f.readline()
text= '告警类型:HostName-配置重复
'
count = 1
while line:
if (count >= 2):
text = text + line
line = f.readline()
count += 1
f.close()
# 钉钉的URL
api_url="https://oapi.dingtalk.com/robot/send?access_token=749b2f448e357b7ffc1bff7b01d3c26a750dfaec75651680fdc8703152837f65"
msg(text,api_url)
执行脚本
告警成功