知识点 1>
PyCharm 连接服务器进行远程开发和调试:
1. 配置目录同步
2. 配置远程python解释器
参考文献:https://zhuanlan.zhihu.com/p/38330654
知识点 2>
python 时间模块 —— time
Time 的表示方式
在Python中,通常① 时间戳,② 格式化的时间字符串,③ 格式化的元组 三种方式表示时间
- 时间戳 (timestamp)
timestamp通常表示从1970年1月1日00时00分00秒开始,按秒计算的偏移量
也就是从1970年1月1日00时00分00(北京时间:1970年1月1日08时00分00)起,到现在的毫秒数
from time import *
print(time())
1542352379.598851
- 时间格式化符号
- struct_time 元组 —— Python函数用一个元组装起来的九个数字处理时间
该元组共有 9 个元素:
年、月、日、时、分、秒、一年中的第几周、一年中的第几天、是否为夏令时
time 模块 常用函数
-
time() :用于返回当前时间的时间戳(timestamp),不需要传递参数
-
localtime([sces]):作用是将时间戳转换为本地时间,secs指转换为stuct_time类型的对象秒数;如果secs参数未输入,就以当前时间为转换标准,返回结果为时间元组(stuct_time)
-
gmtime([secs]):作用是将时间戳转换为本地时间,区别在于后者以UTC时区(0时区)转换时间戳
-
mktime(t):用于执行localtime([sces]) ;gmtime([secs])的反向操作,接收sturct_time对象作为参数(t),返回秒数表示的时间的浮点数; 其中,参数t表示结构化的时间或完整的9位元素
-
strftime(format[,t]): 用于接收时间元组,返回可读字符串标识当地时间;
-
strptime(string[,format]) :可以理解为前者的反向操作,将指定格式的字符串拆解为时间元组
-
sleep(secs):用于推迟调用线程的运行,可通过secs参数指定进程挂起的时间;secs参数代表推迟执行的秒数
# 备注为执行结果
from time import *
print(localtime()) # time.struct_time(tm_year=2018, tm_mon=11, tm_mday=16, tm_hour=15, tm_min=42, tm_sec=25, tm_wday=4, tm_yday=320, tm_isdst=0)
print(gmtime()) # time.struct_time(tm_year=2018, tm_mon=11, tm_mday=16, tm_hour=7, tm_min=42, tm_sec=25, tm_wday=4, tm_yday=320, tm_isdst=0)
print(mktime(localtime())) # 1542354145.0
t = (2018,3,11,16,50,38,0,0,0)
print(strftime('%a %b %d %Y %H:%M:%S',localtime(mktime(t)))) # Sun Mar 11 2018 16:50:38
print(strptime('May 24 13 40 53 2018','%b %d %H %M %S %Y')) # time.struct_time(tm_year=2018, tm_mon=5, tm_mday=24, tm_hour=13, tm_min=40, tm_sec=53, tm_wday=3, tm_yday=144, tm_isdst=-1)
python 时间处理模块 —— datetime
datetime模块定义了以下几个类:
- In:datetime.now()
- Out :datetime.datetime(2019, 8, 7, 19, 40, 55, 623142)
- In : datetime.strftime( datetime.now(), "%Y-%m")
- Out : '2019-08'
知识点 3>
python 重要模块 —— psutil 简介:
psutil(进程和系统实用程序):是一个跨平台库,用于 在Python中检索有关正在运行的进程和系统利用率(CPU,内存,磁盘,网络,传感器)的信息。它主要用于系统监视,分析和限制流程资源以及运行流程的管理。
模块安装:
- pip3 install psutil -i https://pypi.douban.com/simple
psutil 模块实例应用:
1.CPU 中央处理器
2. memory 内存
3.Disk 磁盘
4.network 网络
综合实例应用 —— 编写一段python 程序实现对 linux服务器主机信息监控:
# os模块, operate system, 跟操作系统相关的方法, 多是文件操作等
import os
import platform
from datetime import datetime
import time
try:
# 如果是Linux系统,执行下面内容
# os.uname在windows系统中不能执行
system_info = os.uname()
node = system_info.nodename
system = system_info.sysname
except Exception as e:
# 如果是Windows系统,执行下面内容
system_info = platform.uname()
node = system_info.node
system = system_info.system
import psutil
boot_time = psutil.boot_time()
boot_time = datetime.fromtimestamp(boot_time)
now_time = datetime.fromtimestamp(time.time())
print("""
***********************************主机信息监控********************************
主机名: %s
操作系统: %s
内核名称: %s
发行版本号: %s
内核版本: %s
系统架构: %s
当前时间: %s
开机时间: %s
开机时长: %s
""" %(node, system, system,
system_info.release, system_info.version, system_info.machine,
now_time, boot_time, now_time-boot_time
))
测试结果:
应用项目 —— Sysinfo
环境配置:
- dnf install gcc python3-devel -y # 安装 开发包
- pip3 install psutil -i https://pypi.douban.com/simple # 获取系统运行信息
- pip3 install prettytable -i https://pypi.douban.com/simple # 表格优化
项目主要应用模块及框架
- psutil —— 是一个跨平台库(http://pythonhosted.org/psutil/)能够轻松实现获取系统运行的进程和系统利用率(包括CPU、内存、磁盘、网络等)信息。
- time / datetime —— 时间模块
- Django ——django是用python语言写的开源web开发框架,并遵循MVC设计。
- Bootstrap —— 是一个用于快速开发 Web 应用程序和网站的前端框架。Bootstrap 是基于 HTML、CSS、JAVASCRIPT 的。
代码参考文献:https://github.com/lvah/Sysinfo
项目流程:
- 安装 Bootstrap (一个用于快速开发 Web 应用程序和网站的前端框架)
- 创建Django项目Sysinfo —— django-admin startproject Sysinfo
- 创建子应用 —— python3 manage.py startapp host
- 后台管理(略过,本项目不需要)
- 路由设置和视图函数的编写
- 模板的编写
第一阶段测试:
NO.1 阶段 上传项目代码到GitHub Sysinfo 项目仓库代码查看地址:https://github.com/dodo837132863/Sysinfo
-
git init
Initialized empty Git repository in /root/PycharmProjects/untitled/Sysinfo/.git/
#初始化的空Git存储库在/root/ pycharmprojects /untitled/Sysinfo/.git/
-
git add * # 添加所有项目文件到本地仓库
-
git commit -m "NO.1 Sysinfo Update the configuration Monitor 'system information', 'disk information' and 'user login information' "
- git log
- git remote add origin https://github.com/dodo837132863/Sysinfo.git
- git push -u origin master
Username for 'https://github.com': dodo837132863
Password for 'https://dodo837132863@github.com':
Branch 'master' set up to track remote branch 'master' from 'origin'. # 上传成功
diffib 模块 对比文件差异性
1. if __name__=="__main__"是什么含义?
__name__ 是当前模块名,当模块被直接运行时模块名为 __main__ 。这句话的意思就是,当模块被直接运行时,if 以下代码块将被运行,当模块是被导入时,代码块不被运行。
1. hashlib模块
Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。
2. 摘要算法
摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。
3. 摘要算法的有效性:
摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,
但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。
代码:
import difflib
import hashlib
def find_file_different(filename1, filename2, output_filename):
# 1. 需要分析两个配置文件的不同,需要读取文件的内容
# 如果是windows系统, 目录路径的分隔符是\, 一定要转义
# 如果是Linux系统, 目录路径的分隔符是/, 不需要转义
with open(filename1) as f:
# 读取文件的所有内容,以列表的数据格式存储,每个元素是一行内容。
content1 = f.readlines()
with open(filename2) as f:
content2 = f.readlines()
# 2. 通过diflib模块对文件内容进行对比
# # 2-1). we instantiate a Differ object
# diff = difflib.Differ()
# # 2-2). Finally, we compare the two: result = list(d.compare(text1, text2))
# results = diff.compare(content1, content2)
# for result in results:
# # result是字符串, result.strip方法是删除字符串前面和后面的空格(广义的空格\n, \t,' ')
# print(result.strip())
# 2-3). 以更美观的方式对文件差异性对比进行展示
hdiff = difflib.HtmlDiff()
result = hdiff.make_file(content1, content2) # 会禅城一个html字符串
# 将产生的字符串存储到html文件中
# 文件存储的方法1:python 04_配置文件差异性对比.py > output/diff.html
# print(result)
# 文件存储的方法2: 通过python方法写入文件
with open(output_filename, 'w') as f:
f.write(result)
print("写入html文件[%s]成功" % (output_filename))
def test_fun1():
# 我的代码是Windows系统
filename1 = 'input\\nginx_backup_20200725.conf'
filename2 = 'input\\nginx_backup_20200726.conf'
output_filename = 'output/diff.html'
find_file_different(filename1, filename2, output_filename)
def is_same_file(filename1, filename2):
"""
1. hashlib模块
Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。
2. 摘要算法
摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。
3. 摘要算法的有效性:
摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,
但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。
"""
with open(filename1) as f:
# 读取文件的所有内容,以列表的数据格式存储,每个元素是一行内容。
content1 = f.read()
# 第一种摘要算法的实现方式
# 注意: python3中所有的字符串默认是unicode编码格式,如果需要utf-8编码的时候,使用encode方法进行编码操作
"""
ASCII编码:只能存储英文信息(字母,数字,符号),一个字符占用一个字节,1字节=8位 2^8-1
Unicode编码:是可以支持多种语言,一个字符占用2个字节,2字节=16位, 2^16-1
utf-8编码:如果是中文,占用3个字节,如果是英文
md1 = hashlib.md5()
md1.update(content1.encode('utf-8'))
hex_content1 = md1.hexdigest()
with open(filename2) as f:
content2 = f.read()
md1 = hashlib.md5(content2.encode('utf-8'))
hex_content2 = md1.hexdigest()
return hex_content1 == hex_content2