前言:因为工做内容的缘由,常常须要些python脚本,长此以往,发现有一些方法常常用到,因而就本身动手编辑了一些经常使用的、大众的、通用的方法。小弟不才,但也但愿能为开源作作贡献。python
最后再附上代码哈;ios
一、ping_network(network_ip) --- ping测试的方法sql
二、socket_port(network_ip, port) --- 检测目标网络端口是否开放(正常)的方法docker
三、file_format_analysis(file_path,format) --- 解析json、yaml格式文件的方法json
四、list_contrast(list_a,list_b) --- 对比两个数组数据的方法c#
五、dic_contrast(dic_a,dic_b) --- 对比两个字典数据差别的方法windows
使用方法,只须要将这个 wheel_xpt.py 文件 import导入就能够咯;数组
一、ping_network(network_ip)
使用python中的os模块测试目标ip网络是否可达,返回Trun或False;网络
示例:测试www.baidu.com的连通性app
from wheel_xpt import * result = ping_network("www.baidu.com") print(result)
输出结果:
正在 Ping www.a.shifen.com [61.135.169.121] 具备 32 字节的数据: 来自 61.135.169.121 的回复: 字节=32 时间=7ms TTL=53 来自 61.135.169.121 的回复: 字节=32 时间=5ms TTL=53 来自 61.135.169.121 的回复: 字节=32 时间=5ms TTL=53 来自 61.135.169.121 的回复: 字节=32 时间=5ms TTL=53 61.135.169.121 的 Ping 统计信息: 数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失), 往返行程的估计时间(以毫秒为单位): 最短 = 5ms,最长 = 7ms,平均 = 5ms 本机至 www.baidu.com 网络通畅; True
前面是方法链接测试的输出(注释代码也能够将其取消),最后的True是连通性的判断结果;
接下来再测试一个网络不通的,此次直接使用ip:
from wheel_xpt import * result = ping_network("192.168.0.123") print(result)
输出结果:
正在 Ping 192.168.0.123 具备 32 字节的数据: 请求超时。 请求超时。 请求超时。 请求超时。 192.168.0.123 的 Ping 统计信息: 数据包: 已发送 = 4,已接收 = 0,丢失 = 4 (100% 丢失), 本机至 192.168.0.123 网络不通; False
ping不通的结果返回的就是 False 。
二、socket_port(network_ip, port)
使用python中的socket模块检测ip的端口是否开通;
示例:咱们来检测下csdn的80端口
from wheel_xpt import * result = socket_port("www.csdn.net", "80") print(result)
输出结果:
正在检测目标ip端口......别慌,稍做等待...... 检测 www.csdn.net 80 端口[正常]. True
返回True的话就是该端口开放,返回 False 就是目标端口未开放了;
三、file_format_analysis(file_path,format)
判断文件是否存在,进行json、yaml格式的解析
示例:这里咱们测试解析两个文件,一个json格式,一个yaml格式
from wheel_xpt import * #解析json格式的文件 result_json = file_format_analysis(r"D:\my_files\python_test_file\json_yaml_test\role.json","json") print(result_json) print("====================================================") #解析yaml格式的文件 result_yaml = file_format_analysis(r"D:\my_files\python_test_file\json_yaml_test\predata.yml","yaml") print(result_yaml)
输出结果:测试的两个文件数据量可能有点大了,谅解哈;
D:\my_files\python_test_file\json_yaml_test\role.json 文件存在,进行json解析。 {'MachineGroups': {'Machines': ['a56c07001.cloud.c07.amtest8', 'a56c07002.cloud.c07.amtest8', 'a56c07003.cloud.c07.amtest8'], 'aarch64': [], 'sw_64': []}, 'ServerRoles': {'OpsClone#': ['a56c07001.cloud.c07.amtest8:10.14.4.1:docker010014004001', 'a56c07002.cloud.c07.amtest8:10.14.4.2:docker010014004002'], 'OpsCloneVipAgent#': ['a56c07001.cloud.c07.amtest8:10.14.4.11:docker010014004011'], 'OpsCloneWeb#': ['a56c07001.cloud.c07.amtest8:10.14.4.3:docker010014004003', 'a56c07002.cloud.c07.amtest8:10.14.4.19:docker010014004019'], 'OpsCloneWebVipAgent#': ['a56c07001.cloud.c07.amtest8:10.14.4.12:docker010014004012'], 'OpsDecider#': ['a56c07001.cloud.c07.amtest8', 'a56c07002.cloud.c07.amtest8'], 'OpsDns#': ['a56c07001.cloud.c07.amtest8:10.14.4.5:docker010014004005', 'a56c07002.cloud.c07.amtest8:10.14.4.21:docker010014004021'], 'OpsDnsMaster#': ['a56c07001.cloud.c07.amtest8:10.14.4.6:docker010014004006', 'a56c07002.cloud.c07.amtest8:10.14.4.22:docker010014004022'], 'OpsDnsSlave#': ['a56c07001.cloud.c07.amtest8:10.14.4.7:docker010014004007', 'a56c07002.cloud.c07.amtest8:10.14.4.23:docker010014004023'], 'OpsDnsSlaveVipAgent#': ['a56c07001.cloud.c07.amtest8:10.14.4.8:docker010014004008', 'a56c07002.cloud.c07.amtest8:10.14.4.24:docker010014004024'], 'OpsDnsVipAgent#': ['a56c07001.cloud.c07.amtest8:10.14.4.4:docker010014004004', 'a56c07002.cloud.c07.amtest8:10.14.4.20:docker010014004020'], 'OpsMasterTagAgent#': ['a56c07001.cloud.c07.amtest8'], 'OpsMysql#': ['a56c07001.cloud.c07.amtest8:10.14.4.9:docker010014004009', 'a56c07002.cloud.c07.amtest8:10.14.4.25:docker010014004025'], 'OpsMysqlVipAgent#': ['a56c07001.cloud.c07.amtest8:10.14.4.13:docker010014004013'], 'OpsNtp#': ['a56c07001.cloud.c07.amtest8', 'a56c07002.cloud.c07.amtest8'], 'OpsNtpVipAgent#': ['a56c07001.cloud.c07.amtest8:10.14.4.14:docker010014004014'], 'OpsOob#': ['a56c07001.cloud.c07.amtest8', 'a56c07002.cloud.c07.amtest8'], 'OpsOobVipAgent#': ['a56c07001.cloud.c07.amtest8:10.14.4.15:docker010014004015'], 'OpsTc#': ['a56c07001.cloud.c07.amtest8', 'a56c07002.cloud.c07.amtest8'], 'OpsYum#': ['a56c07001.cloud.c07.amtest8', 'a56c07002.cloud.c07.amtest8'], 'OpsYumVipAgent#': ['a56c07001.cloud.c07.amtest8:10.14.4.16:docker010014004016']}} ==================================================== D:\my_files\python_test_file\json_yaml_test\predata.yml 文件存在,进行yaml解析。 {'dnsslave': [{'anycastVip': ['10.45.250.1/32', '10.45.250.2/32'], 'anycast_ntp_vips': ['10.45.68.0/32', '10.45.68.1/32'], 'anycast_yum_vips': ['10.45.68.2/32'], 'bgpConnections': [], 'bgpanycastVip': [], 'docker0_ip': '10.45.8.8', 'env': {'idcMap': {'amtest34': 'master'}, 'idc_room': 'amtest34', 'isCenterRegion': True, 'region': 'cn-qingdao-sg-d01', 'zone': 'cn-qingdao-sg-amtest34001-a'}, 'ip': '10.45.1.2', 'master': ['10.45.8.6', '10.45.8.22'], 'ospfConnections': [{'localIp': '10.45.152.222/30', 'localPort': 'eth4', 'localas': '65081', 'ospfArea': '0.0.0.201', 'ospfPassword': 'aliospf', 'protocol': 'ospf', 'remoteIp': '10.45.152.221/30', 'remoteas': '65021'}], 'ospfanycastVip': ['10.45.250.1/32', '10.45.250.2/32', '10.45.68.2/32', '10.45.68.0/32', '10.45.68.1/32'], 'resolv_lines': ['nameserver 10.45.250.1', 'nameserver 10.45.250.2', 'nameserver 10.45.8.21', 'nameserver 10.45.8.5'], 'role': 'slave', 'single_mode': False, 'slave': ['10.45.1.1', '10.45.1.2'], 'slave_vips': ['10.45.8.21', '10.45.8.5'], 'subnets': ['10', '172'], 'vips': [{'ip': '10.45.8.21', 'maskbit': 32, 'name': 'VIP_10.45.8.21', 'priority': '85', 'state': 'BACKUP', 'vip_interface': 'docker0', 'virtual_router_id': '50', 'vrrp_interface': 'docker0'}, {'ip': '10.45.8.5', 'maskbit': 32, 'name': 'VIP_10.45.8.5', 'priority': '90', 'state': 'MASTER', 'vip_interface': 'docker0', 'virtual_router_id': '51', 'vrrp_interface': 'docker0'}]}]}
直接返回解析的结果,想要获取json、yaml文件里的某一个数值的话就能够直接使用 result_json/yaml 进行获取了;
四、list_contrast(list_a,list_b)
判断两个数组内的数据是否相同,并输出数组中不一样的数据和交集;(不会损坏原数组)
示例:
from wheel_xpt import * list_1 = ['a','b','c','d'] list_2 = ['a','b','d','f','456'] result = list_contrast(list_1,list_2) print(result)
输出结果:
{'list_same': ['a', 'b', 'd'], 'list_different_a': ['c'], 'list_different_b': ['f', '456']}
返回一个字典:
list_same 是两个数组相同的数值;
list_different_a 是传入第一个数组中不一样的数值;
list_different_b 是传入第二个数组中不一样的数值;
五、dic_contrast(dic_a,dic_b)
判断两个字典内的数据,进行对比,返回相同的数据和不一样的数据;(不会损坏原字典数据)
示例:为了看着方便,测试对比用的字典数据就尽可能减小了;
from wheel_xpt import * dic_1 = { 'a':'艾希', 'b':'赵信', 'c':'嘉文四世', 'd':'内瑟斯', } dic_2 = { 'a':'艾希', 'b':'赵信', 'd':'德玛西亚', } result = dic_contrast(dic_1,dic_2) print(result)
输出结果:
{'same': {'a': '艾希', 'b': '赵信'}, 'diff_a': {'c': '嘉文四世', 'd': '内瑟斯'}, 'diff_b': {'d': '德玛西亚'}}
返回一个字典:
same 是两个字典中键值都相同的数据;
diff_a 是传入第一个字典中不一样的数据;
diff_b 是传入第二个字典中不一样的数据;
额.......咋样,我的以为还算好用吧;虽然网上有一些对比的方法,但仍是感受不如本身写的用着顺手哇,嘎嘎;
最后附上“轮子”源码:
import os import socket import json import yaml """使用python中的os模块测试目标ip网络是否可达,返回Trun或False""" def ping_network(network_ip): #result = os.system("ping %s -w 3 -c 3" % (network_ip)) #在windows下不适用,-c 参数被封; result = os.system("ping %s -w 3" % (network_ip)) if result == 0: print("本机至 %s 网络通畅;" % (network_ip)) return True else: print("本机至 %s 网络不通;" % (network_ip)) return False """使用python中的socket模块检测ip的端口是否开通""" def socket_port(network_ip, port): # global socket_port_number # 定义一个全局参数,返回ip目标端口的连通性:0 为连通,1 为阻塞; print("正在检测目标ip端口......别慌,稍做等待......") s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) try: s.connect((network_ip, int(port))) s.shutdown(2) socket_port_number = 0 except: socket_port_number = 1 pass if socket_port_number == 0: print("检测 %s %s 端口[正常]." % (network_ip, port)) return True else: print("检测 %s %s 端口[关闭]." % (network_ip, port)) return False """判断文件是否存在,进行json、yaml格式的解析""" #用法:在 file_format_analysis() 内传入参数,file_path为文件的绝对路径,format为[json、yaml]两个字段。 def file_format_analysis(file_path,format): #format只能为 json、yaml。 if os.path.exists(file_path) == True: if format == "json": print("%s 文件存在,进行json解析。" % (file_path)) with open(file_path, 'rb') as f: file_json = json.load(f) return file_json elif format == "yaml": print("%s 文件存在,进行yaml解析。" % (file_path)) with open(file_path, 'rb') as files: file_yaml = yaml.load(files,Loader=yaml.FullLoader) return file_yaml else: print("%s 文件存在,只进行判断,不进行解析。" % (file_path)) return True elif os.path.exists(file_path) == False: print("%s 文件不存在。" % (file_path)) return False else: print("判断 %s 文件是否存在时出现异常。" % (file_path)) exit() #判断两个数组内的数据是否相同的,不相同的话输出不一样的数据; #返回一个字典---dic_list: # dic_lsit['list_same'] = ["两个数组交集"] # dic_lsit['list_different_a'] = ["list_a中不一样的数值"] # dic_lsit['list_different_b'] = ["list_b中不一样的数值"] def list_contrast(list_a,list_b): if len(list_a) == 0 or len(list_b) == 0: #判断传入的数字是否为空 print("传入数组不可都为空") exit() list_1 = list_a[:] list_2 = list_b[:] dic_list = {} #定义一个字典,里面存放:一、两个数组相同的数值;二、list_a数组不一样的数值;三、list_b数组不一样的数值; list_same = [] #定义一个列表,存储相同的数值 for i in range(0,len(list_1)): #在数据量相同的状况下,遍历一个数组, if list_1[i] in list_2: list_same.append(list_1[i]) #将相同的数值存储到一个列表中; else: pass dic_list['list_same'] = list_same #将相同的数值存入字典; for i in range(0,len(list_same)): #遍历存放两个数组交集的列表; list_1.remove(list_same[i]) #删除list_a中相同的数值,剩下不一样的数值; list_2.remove(list_same[i]) #删除list_b中相同的数值,剩下不一样的数值; dic_list['list_different_a'] = list_1 #将list_a中不一样的数值存入字典 dic_list['list_different_b'] = list_2 #将list_b中不一样的数值存入字典 return dic_list """判断两个字典内容的方法""" # dic_all["same"] = {两个字典的交集} # dic_all["diff_a"] = {第一个参数中不一样的键值} # dic_all["diff_a"] = {第一个参数中不一样的键值} def dic_contrast(dic_a,dic_b): dic_all = {} dic_same = {} #定义一个字典,存储两个字典中相同的键值; dic_diff_a = {} #定义一个字典,存储第一个参数中不一样的键值; dic_diff_b = {} #定义一个字典,第一个参数中不一样的键值; if len(dic_a) == 0 and len(dic_b) == 0: print("传入字典参数不可都为空") exit() if len(dic_a) >= len(dic_b): #对比两个字典内的数量,遍历多的去和少的对比; for i in dic_a.keys(): #遍历dic_a的键; if i in dic_b.keys(): #若是dic_a中的键在dic_b中存在 if dic_a[i] == dic_b[i]: #则判断值是否相等; dic_same[i] = dic_a[i] else: dic_diff_a[i] = dic_a[i] dic_diff_b[i] = dic_b[i] else: #若是dic_a中的键在dic_b中不存在 dic_diff_a[i] = dic_a[i] else: for i in dic_b.keys(): #遍历dic_b的键; if i in dic_a.keys(): #若是dic_b中的键在dic_a中存在 if dic_b[i] == dic_a[i]: #则判断值是否相等; dic_same[i] = dic_b[i] else: dic_diff_a[i] = dic_a[i] dic_diff_b[i] = dic_b[i] else: #若是dic_b中的键在dic_a中不存在 dic_diff_b[i] = dic_b[i] dic_all["same"] = dic_same dic_all["diff_a"] = dic_diff_a dic_all["diff_b"] = dic_diff_b return dic_all
人生苦短,我用python。以后会继续总结一些经常使用的方法进行添加的;。