为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

蝴蝶不菲 2021-05-12 13:10:36
我有一个使用正则表达式提取的列表,该列表将如下所示:                     SRM Video Dest            UDP   QAM      QAM    PID   In     Out    Detected Input Output PSI      UptimeSession 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      UptimeSession 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 回答

?
繁星点点滴滴

TA贡献1803条经验 获得超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])


查看完整回答
反对 回复 2021-05-18
?
森林海

TA贡献2011条经验 获得超2个赞

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


查看完整回答
反对 回复 2021-05-18
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

您必须将文字剪切为splitlines

for line in videosessions.splitlines():

然后在空格处分割每行:

parts = line.split()

并检查

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

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


查看完整回答
反对 回复 2021-05-18
  • 3 回答
  • 0 关注
  • 176 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信