自己动手造“轮子”---python常用的几个方法

前言:由于工作内容的原因,经常需要些python脚本,久而久之,发现有一些方法经常用到,于是就自己动手编辑了一些常用的、大众的、通用的方法。小弟不才,但也希望能为开源做做贡献。

最后再附上代码哈;

一、目前该文件中只总结了五个方法:

1、ping_network(network_ip)? ?---? ping测试的方法

2、socket_port(network_ip, port)? ---? 检测目标网络端口是否开放(正常)的方法

3、file_format_analysis(file_path,format)? ---? 解析json、yaml格式文件的方法

4、list_contrast(list_a,list_b)? ---? 对比两个数组数据的方法

5、dic_contrast(dic_a,dic_b) --- 对比两个字典数据差异的方法

使用方法,只需要将这个 wheel_xpt.py 文件? import导入就可以咯;

二、方法介绍及示例

1、ping_network(network_ip)
使用python中的os模块测试目标ip网络是否可达,返回Trun或False;

示例:测试www.baidu.com的连通性

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 。

2、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 就是目标端口未开放了;

3、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 进行获取了;

4、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 是传入第二个数组中不同的数值;

5、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 = {}   #定义一个字典,里面存放:1、两个数组相同的数值;2、list_a数组不同的数值;3、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。
之后会继续总结一些常用的方法进行添加的;。

原文地址:https://blog.51cto.com/13577495/2461548

时间: 2024-10-09 20:08:32

自己动手造“轮子”---python常用的几个方法的相关文章

动手造轮子:实现一个简单的 EventBus

动手造轮子:实现一个简单的 EventBus Intro EventBus 是一种事件发布订阅模式,通过 EventBus 我们可以很方便的实现解耦,将事件的发起和事件的处理的很好的分隔开来,很好的实现解耦. 微软官方的示例项目 EShopOnContainers 也有在使用 EventBus . 这里的 EventBus 实现也是参考借鉴了微软 eShopOnContainers 项目. EventBus 处理流程: 微服务间使用 EventBus 实现系统间解耦: 借助 EventBus 我

动手造轮子:实现一个简单的依赖注入(一)

动手造轮子:实现一个简单的依赖注入(一) Intro 在上一篇文章中主要介绍了一下要做的依赖注入的整体设计和大概编程体验,这篇文章要开始写代码了,开始实现自己的依赖注入框架. 类图 首先来温习一下上次提到的类图 服务生命周期 服务生命周期定义: public enum ServiceLifetime : sbyte { /// <summary> /// Specifies that a single instance of the service will be created. /// &

python常用数据类型内置方法介绍

熟练掌握python常用数据类型内置方法是每个初学者必须具备的内功. 一.整型 a = 100 a.xxx() class int(object): def bit_length(self): ##如果将某个整数用2进制表示,返回这个2进制所占bit位数. return 0 def conjugate(self, *args, **kwargs): ##共轭复数 @classmethod # known case def from_bytes(cls, bytes, byteorder, *ar

Python常用异常及处理方法

Python 异常处理 python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误.你可以使用该功能来调试python程序. 异常处理: 本站Python教程会具体介绍. 断言(Assertions):本站Python教程会具体介绍. python标准异常 异常名称 描述 BaseException 所有异常的基类 SystemExit 解释器请求退出 KeyboardInterrupt 用户中断执行(通常是输入^C) Exception 常规错误的基类 StopIter

Python常用函数整理

主要内容: 字符串函数.集合函数.列表函数和字典函数. Python常用函数 字符串函数 方法 说明 capitalize() 返回首字母的大写副本 find(string) 返回字符串中首次出现参数string的索引,如果字符串中没有参数string则返回-1 find(s,beg) 返回字符串中索引beg之后首次出现参数s的索引,如果字符串中索引beg之后没有参数s则返回-1 find(s,beg,end) 返回字符串中索引beg与end之间首次出现参数s的索引,如果字符串中索引beg和en

python 造轮子(一)——序列与字典

虽然说造轮子很少用了,什么底层东西很少写,但是还是很想学扎实,还是好多东西还是的会,没有底层的支持,比较高级的库学起来还是很困难的. 序列的普遍用法: 1 #-*-coding:utf8-*- 2 3 #索引 4 l = [1,2,3,4] 5 t = (1,2,3,4) 6 d = {1:1,2:2,3:3,4:4} 7 8 9 print l[0] 10 print t[0] 11 print d[1] #键索引 12 13 #切片 14 15 print l[0:5] 16 print t

Python基础教程:Python学习视频Python让你敲的代码不再是造轮子

你敲的代码是在造轮子?那就学Python呗!_Python基础教程 Bruce大神说" 人生苦短,我用Python ". 从公司角度而言: 国内基于Python创业成功的案例不在少数,豆瓣.知乎.果壳,全栈都是 Python,大家对Python自然有信心.并且从这几家公司出来的程序员与 CTO,创业的话一般都会选择Python. 从开发者个人角度而言: 计算机语言只是用来达成目的工具,?各种强大的第三方库,拿来就能用才是王道,让程序替代我们执行一些枯燥繁琐的工作.?至于句式是否优美.能

谈谈自己造轮子

写下这篇文章,主要是对我近段时间工作的反思. 为啥要造轮子 对于一些程序员来说,喜欢自己造轮子可算是一个很平常的事情,我想可能有如下原因: 对于一些小的功能,不需要借助外部库,直接能够自己写完搞定. 对于一些大的功能,很多外部库不能很好的与自己项目整合,有时候还不如自己写一个. 有时候即使能用的外部库,因为程序员相轻的思想,就觉得自己写的nb,不用. 还有可能就是想深入学习某一个知识点,自己动手造一个. 我不觉得造轮子不好,曾今很长一段时间我都认为造轮子是体现自己能力很好的一种方式,但是现在越来

我们为什么喜欢重新造轮子

不要重新造轮子,是英文don't re invite wheel的直译.什么是轮子呢,我们一般认为一个通用中间件或框架,和实际业务没有直接关系的代码,就是轮子.这些代码虽然不是实质的业务逻辑,但是在一个项目中往往是担当骨架的作用. 程序员新手的眼中,这些代码就是经验的象征.在很多项目组中,只有经验丰富的老程序员才有机会去设计和选择这些轮子.可以设计可重用的干货代码,也就成为很多对技术有追求的程序员的努力方向.有几年工作经验,在技术上寻求发展的程序员大多都会自己设计和实现一些经典的轮子,这也成为了