从列表中读取行时进行循环

时间:2018-08-03 09:14:00

标签: python extract

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

                     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)

您能给它点些照明吗?

非常感谢您!

3 个答案:

答案 0 :(得分:0)

您需要分割线并比较列。线条看起来像空格分隔。因此,一旦拆分它,列索引就是固定的。示例检测到的比特率是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循环。

答案 1 :(得分:0)

您必须用splitlines剪切文本:

for line in videosessions.splitlines():

然后在空格处分割每行:

parts = line.split()

并检查

parts[10]==0 and parts[11]=="Off"   

您必须省略空行和以“ ---”或“ Session”开头的行。

答案 2 :(得分:0)

我知道了。感谢大家的帮助。 实际上,它是一个包含列表的列表。您需要从列表中提取每一行,并将它们组合成一个新列表。 这就是为什么我一开始的代码无法正常工作的原因。

这是代码。

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])