从列表中读取行时的for循环

我有一个使用正则表达式提取的列表,该列表将如下所示:


                     SRM Video Dest            UDP   QAM      QAM    PID   In     Out    Detected Input Output PSI      Uptime

Session ID           ID  Intf  IpAddress       Port  Chan     Domain Remap ProgNo ProgNo Bitrate  State State  Detected (s)    Encryption

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

000a000905000176794c 1   1     232.232.40.1    55000 0/0/48   2      No    62351  62351  46000    Off    On     Yes      3175405 Clear     

000a000905000176794d 1   1     232.232.40.1    55000 0/0/49   2      No    62351  62351  46000    On    On     Yes      3175405 Clear     

000a000905000176794e 1   1     232.232.40.1    55000 0/0/50   2      No    62351  62351  46000    Off    Off     Yes      3175405 Clear  

读取逻辑如下,其中w00和w0是两个命令行。我在两个命令之间提取了内容。


with open(file, 'r', encoding='UTF-8') as fp_nei:

            fp_reader = fp_nei.read()

            pat = re.compile(w00 + '(.*?)' + w0, re.S)

            videosession = pat.findall(fp_reader)

我想在“检测到的比特率”为零或“输入状态”为“关”时过滤该行。


如下所示:


                     SRM Video Dest            UDP   QAM      QAM    PID   In     Out    Detected Input Output PSI      Uptime

Session ID           ID  Intf  IpAddress       Port  Chan     Domain Remap ProgNo ProgNo Bitrate  State State  Detected (s)    Encryption

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

000a000905000176794c 1   1     232.232.40.1    55000 0/0/48   2      No    62351  62351  46000    Off    On     Yes      3175405 Clear        

000a000905000176794e 1   1     232.232.40.1    55000 0/0/50   2      No    62351  62351  46000    Off    Off     Yes      3175405 Clear 

我尝试使用如下所示的简单方法,但是似乎输出显示了所有行,而不是带有“ Off”的行。


for line in videosession:

    if "Off" in line:

        print(line)

您能给它点些照明吗?


蝴蝶不菲
浏览 185回答 3
3回答

繁星点点滴滴

我已经知道了。感谢大家的帮助。实际上,它是一个包含列表的列表。您需要从列表中提取每一行,并将它们组合成一个新列表。这就是为什么我一开始的代码无法正常工作的原因。这是代码。num=[]split_line=[]row = []for line in videosession:    split_line=line.split()for i,v in enumerate(split_line):    if v=="Clear" :        num.append(i)for k,val in enumerate(num):    start=0 + k * 16    end=val+1    row.append(split_line[start:end])for m,n in enumerate(row):    if "Off" in row[m] or float(row[m][10])==0.0:        print(row[m])

森林海

您需要分割线并比较列。线条看起来像是空间分隔开的。因此,一旦拆分它,列索引就是固定的。示例检测到的比特率是10,输入状态是11。with open('testfile_data', 'r', encoding='UTF-8') as fp_nei:            lines = fp_nei.readlines()            i = 0            for line in lines:                value = line.strip().replace('-', '').strip()                 if len(value) == 0:                    break                i += 1            lines = lines[i+1:]for line in lines:    split_line = line.split()    if split_line[11] == 'Off' or float(split_line[10]) == 0.0:        print(line)注意:文件读取和删除标头效率不高。如果标题是恒定的,则只需要执行lines = lines [3:]即可直接获得行,而不是for循环。

MMMHUHU

您必须将文字剪切为splitlines:for line in videosessions.splitlines():然后在空格处分割每行:parts = line.split()并检查parts[10]==0 and parts[11]=="Off"您必须省略空行以及以“ ---”或“ Session”开头的行。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python