python 對ip段處理


需求:  ip段 20.20.20.20-20.21.11.11 插入數據庫

-------------------------------------------------------

寫下來供以后重用或有需要的同行~

#生成下一次循環的邊界條件
def get_side(pos,now):
    global begin,end
    global first,last

    #   find_side                   #
    #---------in---------------
    #begin 110.67.1.95 end 111.67.1.95
    #first 110.x.x.x   last 111.x.x.x
    #pos 110 now 0
    #---------out--------------
    #first 110.67.x.x  last 111.255.x.x
    #                               #
    find_side = lambda begin, end, pos, fisrt, last, now:\
                ( pos == first[now] and begin[now + 1] or 1, pos == last[now] and end[now + 1] or 255)

    first[now + 1],last[now + 1] = find_side(begin,end,pos,first,last,now)
    return range(first[now + 1],last[now + 1] + 1)


def gen_ip(ip):
    '''
    in in 110.67.1.30-110.67.1.32
    out '{"110.67.1.30", "110.67.1.31", "110.67.1.33"}'
    '''
    #ip段范圍
    global begin, end
    #臨時列表,存儲邊界條件
    global first, last
    sides = ip.split('-')
    begin = map(lambda x:int(x),sides[0].split('.'))
    end   = map(lambda x:int(x),sides[1].split('.'))

    first[0] = begin[0]
    last[0] = end[0]
    ip_str = "'{%s}'"
    tmp = ""

    for pos_one in range(begin[0],end[0] + 1):
        for pos_two in get_side(pos_one,0):
            for pos_three in get_side(pos_two,1):
                for pos_four in get_side(pos_three,2):
                    str = '"%d.%d.%d.%d",' % (pos_one, pos_two, pos_three, pos_four)
                    tmp += str

    return ip_str % tmp.rstrip(',')

思路為從ip起始段的首位開始循環,共4層循環。 

整個轉換需要注意的問題只有一個, 如何在循環內正確的處理邊界值。

例如 10.10.10.10-10.10.20.1

在第三個字段應該分別進行如下循環:  10.10 - 10.255; 11.1 -11.255 .... 19.255;  20.1

考慮一下,這里其實分為三種情況,當前循環的是起始、過渡和終止字段。

因此#14 行做了兩個三元操作,大致類似於  pos == from ? begin+1 : 1, pos == to ? end + 1 :255

實現了根據當前循環內容與起始段、終止段是否一致,寫入對應的邊界

當然,在特殊情況下1. ip前兩段不同,后兩段一致時 會導致缺少部分數據,不過因為這次我在項目里用到的IP范圍不可能達到后面這個范圍,因此忽略了這個bug。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM