【问题标题】:Python Array FunctionPython 数组函数
【发布时间】:2013-10-25 14:01:45
【问题描述】:

我正忙着为我的网络嗅探器编写一个阅读器。它将所有类型的数据写入 MySQL 数据库。我正在尝试以可读的方式将数据打印到我的控制台中。我已经构建了两个函数来打印我的数据

def printHeader(destination, source, protocol):
print('Ethernet Frame:')
print(('| - Destination: {}, Source: {}, Protocol: {}')
      .format(destination, source, protocol))

def printDNS(version, header_length, ttl, protocolEGP, source, target, source_port, destination_port, length):
    print('| - IPv4 Packet:')
    print(('    | - Version: {}, Header Length: {}, TTL: {},'
           ).format(version, header_length, ttl))
    print(('    | - Protocol: {}, Source: {}, Target: {}'
           ).format(protocolEGP, source, target))
    print('    | - UDP Segment:')
    print(('        | - Source Port: {}, Destination Port: {}, '
           'Length: {}').format(source_port, destination_port, length))

def openCON(query):

    conn = cymysql.connect(host='*', port=3306, user='root', passwd='*', db='python')
    cur = conn.cursor()
    cur.execute(query)
    data = []
    for row in cur:
        data.extend(row)
    cur.close()
    conn.close()
    return data

现在,当我运行查询时,我会检索到如下内容:

[19, '88:9F:FA:D3:0B:5F', '192.168.178.24', 8, 4, 20, 64, 17, '212.54.40.25', 52698, 53, 28485, 18, '88:9F:FA:D3:0B:5F', '192.168.178.24', 8, 4, 20, 64, 17, '212.54.40.25', 52681, 53, 28485, 20, '88:9F:FA:D3:0B:5F', '192.168.178.24', 8, 4, 20, 64, 17, '212.54.40.25', 34310, 53, 28502]

我正在尝试遍历数组以将正确的数组索引发送到函数

示例:第一个数组[1:3] 应发送到 printHeader() 第二部分 array[4:11] 应该被发送到 printDNS() 第一个数组是包号,在这个例子中没有使用那个。 然后我需要将数组 [13:15] 发送到 printHeader() 等。

如果尝试类似的方法,我似乎无法弄清楚如何以一种不错的方式编写代码,但我们都知道这很可怕;也尝试过循环,但到目前为止没有成功

DNS = openCON(query)

z = 1
x = 2
c = 3
a = 4
s = 5
d = 6
g = 7
h = 8
j = 9
k = 10
l = 11
p = 12

while True:
    if p < len(DNS):
        printHeader(DNS[(z)], DNS[(x)], DNS[(c)])
        printDNS(DNS[(a)], DNS[(s)], DNS[(d)], DNS[(g)], DNS[(h)], DNS[(j)], DNS[(k)], DNS[(l)], DNS[(p)])
        z += 12
        x += 12
        c += 12
        a += 12
        s += 12
        d += 12
        g += 12
        h += 12
        j += 12
        k += 12
        l += 12
    else:
        break

有人可以帮助我朝着正确的方向前进,以编写这个漂亮而高效的代码吗?我想也许我不应该查询整个表,而只查询一行。

提前致谢。

【问题讨论】:

    标签: python mysql arrays


    【解决方案1】:

    您可以在openCON 中构造一个列表列表,而不是将多个 dns 数据放在一个列表中。只需将extend 替换为append。那么返回值的布局会更合理:

    [
        [19, '88:9F:FA:D3:0B:5F', '192.168.178.24', 8, 4, 20, 64, 17, '212.54.40.25', 52698, 53, 28485], 
        [18, '88:9F:FA:D3:0B:5F', '192.168.178.24', 8, 4, 20, 64, 17, '212.54.40.25', 52681, 53, 28485], 
        [20, '88:9F:FA:D3:0B:5F', '192.168.178.24', 8, 4, 20, 64, 17, '212.54.40.25', 34310, 53, 28502]
    ]
    

    听起来你已经知道slice 操作,你应该在这里使用它。在将数组作为参数传递给函数时,还应该使用 splat 运算符 *

    dnsses = openCON(query)
    for dns in dnsses:
        printHeader(*dns[0:3])
        printDNS(*dns[3:])
    

    【讨论】:

      【解决方案2】:

      使用切片。此功能可以像这样返回列表的子列表:

      a = [1, 2, 3, 4,5]
      a[2:3]   # [3]
      a[2:5]   # [3, 4, 5]
      a[-4:-2] # [2, 3]
      a[1:3]   # [2, 3]
      

      这使您能够轻松定义应将哪些元素传递给函数。而不是

      printHeader(DNS[(z)], DNS[(x)], DNS[(c)])
      

      你可以写

      printHeader(DNS[:3])

      【讨论】:

        猜你喜欢
        • 2014-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-02
        • 2019-07-05
        • 1970-01-01
        • 2021-07-25
        • 2014-01-16
        相关资源
        最近更新 更多