记录运维工作中常用的python模块
pymsql模块
用于mysql数据库操作
import pymysql
# 连接到MySQL数据库
conn = pymysql.connect(
host='localhost',
user='your_username',
password='your_password',
database='your_database'
)
# 创建一个游标对象
cursor = conn.cursor()
# 执行查询
cursor.execute("SELECT * FROM your_table")
# 获取查询结果
results = cursor.fetchall()
for row in results:
print(row)
# 插入数据
cursor.execute("INSERT INTO your_table (column1, column2) VALUES (%s, %s)", ('value1', 'value2'))
conn.commit()
# 更新数据
cursor.execute("UPDATE your_table SET column1 = %s WHERE column2 = %s", ('new_value', 'old_value'))
conn.commit()
# 删除数据
cursor.execute("DELETE FROM your_table WHERE column = %s", ('value_to_delete',))
conn.commit()
# 关闭游标和连接
cursor.close()
conn.close()
paramiko模块
执行ssh远程命令
import paramiko
# 连接到远程服务器
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
hostname = 'your_server_ip'
username = 'your_username'
password = 'your_password'
ssh.connect(hostname, username=username, password=password)
# 执行远程命令
stdin, stdout, stderr = ssh.exec_command('ls -l')
output = stdout.read().decode('utf-8')
print(output)
# 关闭连接
ssh.close()
上传文件
import paramiko
# 连接到远程服务器
transport = paramiko.Transport((hostname, 22))
transport.connect(username=username, password=password)
# 创建SFTP客户端
sftp = paramiko.SFTPClient.from_transport(transport)
# 上传文件
local_path = '/path/to/local/file.txt'
remote_path = '/path/to/remote/file.txt'
sftp.put(local_path, remote_path)
# 关闭连接
sftp.close()
transport.close()
下载文件
import paramiko
# 连接到远程服务器
transport = paramiko.Transport((hostname, 22))
transport.connect(username=username, password=password)
# 创建SFTP客户端
sftp = paramiko.SFTPClient.from_transport(transport)
# 下载文件
local_path = '/path/to/local/file.txt'
remote_path = '/path/to/remote/file.txt'
sftp.get(remote_path, local_path)
# 关闭连接
sftp.close()
transport.close()
tqdm
用于显示进度条,适用于长时间运行的任务
from tqdm import tqdm
import time
# 假设我们有一个任务需要迭代100次
for i in tqdm(range(100), desc="Processing", ncols=100):
# 模拟一些耗时的操作
time.sleep(0.01)
# 循环结束后,进度条会自动关闭
os
日志清理,递归删除文件夹下日志
# coding=utf-8
import os
def clear_log():
# 清理日志路径
log_path = ''
log_list = os.listdir(log_path)
print(log_list)
for i in log_list:
# 跳过不删除的文件
if i == '':
continue
else:
# 拼接字符串
log_i_path = os.path.join(log_path, i)
print(log_i_path)
# 判断是文件夹,执行递归
if os.path.isdir(log_i_path):
clear_log(log_i_path)
else:
# 异常判断,无异常删除
try:
os.remove(log_i_path)
except Exception as e:
print(e)
if __name__ == "__main__":
clear_log()
logging
日志模块
import logging
# 创建日志记录器
logger = logging.getLogger('example_logger')
logger.setLevel(logging.DEBUG)
# 创建控制台日志输出
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
# 创建日志格式
log_format = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
console_handler.setFormatter(log_format)
# 添加控制台日志输出
logger.addHandler(console_handler)
# 记录日志信息
logger.debug('This is a debug message.')
logger.info('This is an info message.')
logger.warning('This is a warning message.')
logger.error('This is an error message.')
logger.critical('This is a critical message.')
schdeul
定时任务调度
import schedule
import time
# 定义一个要调度的函数
def job():
print("Job executed at", time.ctime())
# 定义一个调度器,每5秒执行一次 job
schedule.every(5).seconds.do(job)
# 主循环,用于运行待处理的定时任务
while True:
# 检查并运行所有待处理的定时任务
schedule.run_pending()
# 等待一段时间,然后再次检查
time.sleep(1)
requeset
处理get和post请求
import requests
# GET 请求
response_get = requests.get('http://example.com/api/data?key=value')
print(response_get.text)
# POST 请求
data = {'key': 'value'}
response_post = requests.post('http://example.com/api/submit', data=data)
print(response_post.status_code)
openpyxl
操作excle
写入excle数据
from openpyxl import Workbook
# 创建新工作簿
wb = Workbook()
ws = wb.active # 获取活动工作表
# 写入数据
ws['A1'] = 'Name'
ws['B1'] = 'Age'
ws['A2'] = 'John Doe'
ws['B2'] = 30
# 保存文件
wb.save('example.xlsx')
读取excle数据
from openpyxl import load_workbook
# 加载工作簿
wb = load_workbook('example.xlsx')
ws = wb['Sheet1'] # 如果有多个工作表,可以指定名称或索引
# 读取单元格数据
name = ws['A1'].value
age = ws['B1'].value
print(f'Name: {name}, Age: {age}')
smtplib
发送电子邮箱
import smtplib
from email.message import EmailMessage
# 邮件内容
msg = EmailMessage()
msg.set_content('这是一封测试邮件。')
# 邮件头
msg['Subject'] = '测试邮件标题'
msg['From'] = '你的邮箱地址'
msg['To'] = '收件人的邮箱地址'
# SMTP 服务器设置
smtp_server = 'smtp.example.com'
smtp_port = 587 # 或者 465,取决于你的 SMTP 服务器设置
smtp_username = '你的邮箱用户名'
smtp_password = '你的邮箱密码'
# 创建 SMTP 连接
with smtplib.SMTP(smtp_server, smtp_port) as server:
server.starttls() # 如果需要,启用 TLS
server.login(smtp_username, smtp_password) # 如果需要,登录 SMTP 服务器
server.send_message(msg)
下载网络图片,保存到本地
import requests
import shutil
def pic_down(image_url):
# 计算图片保存到本地时的文件名
pic_name = 'pic/' + image_url.split('/')[-1]
# 发送 HTTP GET 请求并以流的形式获取响应内容
response = requests.get(image_url, stream=True)
# 检查响应状态码是否为 200
if response.status_code == 200:
# 使用 with 语句打开文件并以二进制写入模式保存图片
with open(pic_name, 'wb') as f:
shutil.copyfileobj(response.raw, f)
# 打印下载成功消息
print('Image downloaded successfully.')
try-except
异常处理
def divide(x, y):
try:
# 尝试执行除法操作
result = x / y
except ZeroDivisionError:
# 如果除数为零,捕获 ZeroDivisionError 异常
print("Error: Division by zero is not allowed.")
except Exception as e:
# 捕获其他未预料到的异常
print(f"An unexpected error occurred: {e}")
else:
# 如果没有发生异常,执行这里的代码
print(f"The result of the division is: {result}")
finally:
# 无论是否发生异常,都会执行这里的代码
print("Execution of the divide function is complete.")
# 调用函数
divide(10, 2) # 正常情况
divide(10, 0) # 除数为零的情况
divide("10", 2) # 类型错误的情况
redis
对redis操作
import redis
# 连接到本地的 6379 端口(默认配置)
r = redis.Redis(host='localhost', port=6379, db=0,password='')
# 存储键值对(键为 "key", 值为 "value")
r.set("key", "value")
# 获取键的值
value = r.get("key")
print(value)
# 设置键值对,过期时间为 10 秒
r.setex("key", 10, "new_value")
# 向列表添加元素
r.rpush("list_name", "element1", "element2")
# 从列表左侧弹出元素
first_element = r.lpop("list_name")
print(first_element)
# 获取列表的一部分
elements = r.lrange("list_name", 0, -1)
print(elements)
# 向集合添加元素
r.sadd("set_name", "element1", "element2")
# 获取集合中的所有元素
elements = r.smembers("set_name")
print(elements)
# 存储哈希中的键值对
r.hset("hash_name", "key1", "value1")
# 获取哈希中的值
value = r.hget("hash_name", "key1")
print(value)
sockert
检测ip,端口可达性
import socket
# 定义检测 IP 地址和端口是否可达的函数
def get_port(socket_ip, socket_port):
# 创建一个 TCP 套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置超时时间为 3 秒
s.settimeout(3)
# 尝试连接指定的 IP 地址和端口
socket_result = s.connect_ex((socket_ip, socket_port))
# 关闭套接字
s.close()
# 返回连接结果
return socket_result
重启jar包服务
# 定义要使用的端口号
port = 8001
# 构建查找并关闭指定端口的命令
find_port = 'fuser -k -n tcp %s' % port
try:
# 执行关闭指定端口的命令,并获取输出结果
result = os.popen(find_port)
text = result.read()
# 打印输出结果
print(text)
except Exception as e:
# 如果执行关闭端口命令出现异常,记录异常信息到日志文件
file1 = open("logs.txt", "a")
file1.write('\\n' + str(datetime.now().strftime('%Y-%m-%d %H:%M:%S')) + ' kill port8001')
file1.close()
# 启动一个 Java 应用程序监听指定端口
os.system(
'nohup java -jar app.jar --server.port=8001 --capture.group=1 --capture.thread=10 >/dev/null 2>&1 &')
# 打印执行成功信息
print('执行成功8001')
zipfile
zip压缩解压文件
import zipfile
def creat_zip():
# 创建一个新的 ZIP 文件
with zipfile.ZipFile('archive.zip', 'w') as zipf:
# 将文件添加到 ZIP 文件中
zipf.write('123')
zipf.write('1231')
# 可以指定压缩级别
def read_zip():
with zipfile.ZipFile('archive.zip', 'r') as zipf:
# 打印 ZIP 文件中的所有文件名
for filename in zipf.namelist():
print(filename)
def tar_zip():
# 打开一个现有的 ZIP 文件
with zipfile.ZipFile('archive.zip', 'r') as zipf:
# 解压缩所有文件到当前目录
zipf.extractall()