File Python 3,从文件问题中提取信息

File Python 3,从文件问题中提取信息,file,python-3.x,edit,expect,xlwt,File,Python 3.x,Edit,Expect,Xlwt,再次请求帮助。但是,在我开始之前,这里会有很多文本,所以请对此表示歉意。 在.xlsx书中,我有大约500个IP地址,设备种类为2个 我想: 远程登录设备。检查设备(通过身份验证提示)类型1或类型2 如果设备类型为1-在2x分区中获取固件版本 在excel文件中写入: 第1列-IP地址 第2列-设备类型 第3列-固件版本 第4列-保留分区中的固件版本 如果类型2-写入excel文件: 第1列-IP地址 第2列-设备类型 如果设备关闭,或设备类型3(未知)-在excel文件中写入: 第1列-IP地

再次请求帮助。但是,在我开始之前,这里会有很多文本,所以请对此表示歉意。 在.xlsx书中,我有大约500个IP地址,设备种类为2个 我想: 远程登录设备。检查设备(通过身份验证提示)类型1或类型2

如果设备类型为1-在2x分区中获取固件版本 在excel文件中写入: 第1列-IP地址 第2列-设备类型 第3列-固件版本 第4列-保留分区中的固件版本

如果类型2-写入excel文件: 第1列-IP地址 第2列-设备类型

如果设备关闭,或设备类型3(未知)-在excel文件中写入: 第1列-IP地址 第2列-结果(EOF,超时)

我所做的:我能够远程登录到设备,检查设备类型,在excel中写入两列(在1列IP地址中,在2列中是设备类型,或EOF/超时结果) 而且,我正在将会话的完整日志以IP_ADDRESS.txt格式写入文件,以便将来进行诊断

我不明白怎么做?我不明白如何获得固件版本,并把它放在3,4列。 我无法理解如何实时处理当前日志会话,因此我决定将日志从主文件(IP_ADDRESS.txt)复制到temp.txt以处理它。 我不明白如何提取我需要的信息。 文件输出示例:

    Trying 10.40.81.167...

    Connected to 10.40.81.167.

    Escape character is '^]'.



    ####################################
    #                                  #
    # RADIUS authorization disabled    #
    # Enter local login/password       #
    #                                  #
    ####################################
    bt6000 login: admin
    Password: 
    Please, fill controller information at first time (Ctrl+C to abort): 
    ^C
    Controller information filling canceled.
    ^Cadmin@bt6000# firmware info
    Active boot partition:  1
    Partition 0 (reserved):
            Firmware:       Energomera-2.3.1
            Version:        10117
    Partition 1 (active):
            Firmware:       Energomera-2.3.1_01.04.15c
            Version:        10404M
    Kernel version: 2.6.38.8 #2 Mon Mar 2 20:41:26 MSK 2015
    STM32:
            Version:        bt6000 10083
            Part Number:    BT6024
            Updated:        27.04.2015 16:43:50
    admin@bt6000# 
我需要值-在“Energomera”字之后,比如2.3.1用于保留分区,2.3.1_01.04.15c用于活动分区。 我尝试过处理字符串数字和提取字符串,但没有任何好的结果

下面是我脚本的完整代码

    import pexpect
    import pxssh
    import sys          #hz module
    import re           #Parser module
    import os           #hz module
    import getopt
    import glob                     #hz module
    import xlrd                     #Excel read module
    import xlwt                     #Excel write module
    import telnetlib                #telnet module
    import shutil

    #open excel book
    rb = xlrd.open_workbook('/samba/allaccess/Energomera_Eltek_list.xlsx')
    #select work sheet
    sheet = rb.sheet_by_name('IPs')
    #rows number in sheet
    num_rows = sheet.nrows
    #cols number in sheet
    num_cols = sheet.ncols
    #creating massive with IP addresses inside
    ip_addr_list = [sheet.row_values(rawnum)[0] for rawnum in range(sheet.nrows)]
    #create excel workbook with write permissions (xlwt module)
    wb = xlwt.Workbook()
    #create sheet IP LIST with cell overwrite rights
    ws = wb.add_sheet('IP LIST', cell_overwrite_ok=True)
    #create counter
    i = 0
    #authorization details
    port = "23"                             #telnet port
    user = "admin"                         #telnet username
    password = "12345"                  #telnet password

    #firmware ask function
    def fw_info():
        print('asking for firmware')
        px.sendline('firmware info')
        px.expect('bt6000#')

    #firmware update function
    def fw_send():
        print('sending firmware')
        px.sendline('tftp server 172.27.2.21')
        px.expect('bt6000')
        px.sendline('firmware download tftp firmware.ext2')
        px.expect('Updating')
        px.sendline('y')
        px.send(chr(13))
        ws.write(i, 0, host)
        ws.write(i, 1, 'Energomera')

    #if eltek found - skip, write result in book
    def eltek_found():
        print(host, "is Eltek. Skipping")
        ws.write(i, 0, host)
        ws.write(i, 1, 'Eltek')

    #if 23 port telnet conn. refused - skip, write result in book
    def conn_refuse():
        print(host, "connection refused")
        ws.write(i, 0, host)
        ws.write(i, 1, 'Connection refused')

    #auth function
    def auth():
        print(host, "is up! Energomera found. Starting auth process")
        px.sendline(user)
        px.expect('assword')
        px.sendline(password)

    #start working with ip addresses in ip_addr_list massive
    for host in ip_addr_list:
    #spawn pexpect connection 
        px = pexpect.spawn('telnet ' + host)
        px.timeout = 35
        #create log file with in IP.txt format (10.1.1.1.txt, for example)
        fout = open('/samba/allaccess/Energomera_Eltek/{0}.txt'.format(host),"wb")
        #push pexpect logfile_read output to log file
        px.logfile_read = fout
        try:
            index = px.expect (['bt6000', 'sername', 'refused'])
            #if device tell us bt6000 - authorize        
            if index == 0:
                auth()  
                index1 = px.expect(['#', 'lease'])
                #if "#" - ask fw version immediatly
                if index1 == 0:
                    print('seems to controller ID already set')
                    fw_info()
                #if "Please" - press 2 times Ctrl+C, then ask fw version
                elif index1 == 1:
                    print('trying control C controller ID')
                    px.send(chr(3))
                    px.send(chr(3))
                    px.expect('bt6000')
                    fw_info()
    #firmware update start (temporarily off)
    #            fw_send()

    #Eltek found - func start
            elif index == 1:
                eltek_found()
    #Conn refused - func start
            elif index == 2:
                conn_refuse()
                #print output to console (test purposes)
                print(px.before)
            px.send(chr(13))
    #Copy from current log file to temp.txt for editing
            shutil.copy2('/samba/allaccess/Energomera_Eltek/{0}.txt'.format(host), '/home/bark/expect/temp.txt')
    #EOF result - skip host, write result to excel
        except pexpect.EOF:
            print(host, "EOF")
            ws.write(i, 0, host)
            ws.write(i, 1, 'EOF')
            #print output to console (test purposes)
            print(px.before)
    #Timeout result - skip host, write result to excel
        except pexpect.TIMEOUT:
            print(host, "TIMEOUT")
            ws.write(i, 0, host)
            ws.write(i, 1, 'TIMEOUT')
            #print output to console (test purposes)
            print(px.before)
            #Copy from current log file to temp.txt for editing
            shutil.copy2('/samba/allaccess/Energomera_Eltek/{0}.txt'.format(host), '/home/bark/expect/temp.txt') 
            #count +1 to correct output for Excel
        i += 1 
    #workbook save
    wb.save('/samba/allaccess/Energomera_Eltek_result.xls')          
你们有什么建议或想法吗,伙计们,我该怎么做? 非常感谢您的帮助。

您可以使用

例如:

>>> import re
>>> 
>>> str = """
... Trying 10.40.81.167...
... 
...     Connected to 10.40.81.167.
... 
...     Escape character is '^]'.
... 
... 
... 
...     ####################################
...     #                                  #
...     # RADIUS authorization disabled    #
...     # Enter local login/password       #
...     #                                  #
...     ####################################
...     bt6000 login: admin
...     Password: 
...     Please, fill controller information at first time (Ctrl+C to abort): 
...     ^C
...     Controller information filling canceled.
...     ^Cadmin@bt6000# firmware info
...     Active boot partition:  1
...     Partition 0 (reserved):
...             Firmware:       Energomera-2.3.1
...             Version:        10117
...     Partition 1 (active):
...             Firmware:       Energomera-2.3.1_01.04.15c
...             Version:        10404M
...     Kernel version: 2.6.38.8 #2 Mon Mar 2 20:41:26 MSK 2015
...     STM32:
...             Version:        bt6000 10083
...             Part Number:    BT6024
...             Updated:        27.04.2015 16:43:50
...     admin@bt6000#
... """
>>> re.findall(r"Firmware:.*?([0-9].*)\s", str)
['2.3.1', '2.3.1_01.04.15c']

>>> reserved_firmware = re.search(r"reserved.*\s*Firmware:.*?([0-9].*)\s", str).group(1)
>>> reserved_firmware
'2.3.1'
>>> active_firmware = re.search(r"active.*\s*Firmware:.*?([0-9].*)\s", str).group(1)
>>> active_firmware
'2.3.1_01.04.15c'
>>> 

工作得很有魅力。多谢各位!将在regex手册页面查看更多,非常有趣的可能性。