我有一个使用正则表达式提取的列表,该列表如下所示:
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)
您能给它点些照明吗?
非常感谢您!
答案 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])