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

Python 从列表中读取行时的for循环,python,extract,Python,Extract,我有一个使用常规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 Bitr

我有一个使用常规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  
                     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 
读取逻辑如下所示,其中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     
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  
                     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”的行

请你把灯照一下好吗


多谢各位

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

您必须通过
分割线来剪切文本

for line in videosessions.splitlines():
然后在空格处拆分每行:

parts = line.split()
检查

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

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

我知道了。谢谢大家的帮助。 实际上,它是一个包含列表的列表。您需要从列表中提取每一行,并将它们合并为一个新列表。 这就是为什么我的代码在开始时不起作用

这是代码

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

你能用更多的复制粘贴格式粘贴数据吗?为什么不使用数据框呢?这会更容易。@user2906838,我不想使用pandas,因为代码将打包为exe,pandas模块将占用较大的空间。我们可以不用熊猫吗?不是吗,你的输入是全文,不是列表?您已注意到问题中的列表,这令人困惑。实际上,您可以从头开始,提供文件内容的示例,以及如何从中获得列表。w0和w00代表什么?似乎AttributeError:“list”对象没有“splitlines”属性。在这种情况下,我们为什么需要使用拆分行?@Winnie-c如果您确实有一个列表(如您所说),但您提供了一个文本,即一个长字符串,则不需要它。这是我的出发点,这是一个列表。如果打印(键入(videosession)),它将显示为列表。我不明白如果我们打印(第[10]部分),它将只显示“输入”。如果它是一个列表,那么为什么不在问题中显示为一个列表。问题中有明文规定。这让我很难帮助你。谢谢你提供的答案。但是,它打印了一个错误“ValueError:无法将字符串转换为浮点:‘输入’”。如果我只打印(分割线[1]),它将只打印“视频”。这是因为字符串之间的空间吗?你能把你的行放在逻辑上吗。我猜代码假定行只有值行,而没有行标题。但是看起来列/行标题没有被删除。感谢您的回复。我编辑了我的问题。希望能有帮助。非常感谢。