从lis读取行时的for循环

2024-06-14 06:03:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个使用regular express提取的列表,列表如下:

                     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)

你能给它照点光吗?你知道吗

非常感谢!你知道吗


Tags: noid列表onvideolineyesstate
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])

必须按splitlines剪切文本:

for line in videosessions.splitlines():

然后在空格处拆分每行:

parts = line.split()

检查一下

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

必须省略空行和以“-”或“Session”开头的行。你知道吗

您需要拆分行并比较列。这些线看起来像是分开的。所以一旦你拆分了它,列索引就固定了。示例:检测到的比特率为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)

注意:文件读取和删除头是没有效率的。如果headers是常量,那么只需执行lines=lines[3:]即可直接获得行,而不是for循环。你知道吗

相关问题 更多 >