如何在python中读取2个特定行

时间:2015-11-08 08:17:00

标签: python parsing

我有一个变量,它保存的内容与此

有些相似
**** SOME JUNK DATA ****
**** SOME JUNK DATA ****
**** SOME JUNK DATA ****
Main_data1;a;b;c;dss;e;1
Main_data2;aa;bb;sdc;d;e;2
Main_data3;aaa;bbb;ccce;d;e;3
Main_data4;aaaa;bbbb;cc;d;e;4
Main_data5;aaaaa;bbbbb;cccc;d;e;5
**** SOME JUNK DATA ****
**** SOME JUNK DATA ****
**** SOME JUNK DATA ****

我想读取以Main_data1开头的数据。{只读最后一列并将其存储到列表中}。请注意,这是一个保存此数据的变量,这不是文件。

我想要的输出:

Some_list=[1,2,3,4,5]

我想过用这样的东西。

for line in var_a.splitlines():
     if Main_data1 in line:
        print (line)

但是我需要读取最后一列200多行。什么是一种有效的方法呢

4 个答案:

答案 0 :(得分:1)

检查行是否以"Main_data"开头而不是以分号;分割,并按索引-1选择最后一个元素:

some_list = []
for line in var_a.split("\n"):
     if line.startswith("Main_data"):
          some_list.append(int(line.split(";")[-1]))

答案 1 :(得分:1)

您可以使用列表推导来存储数字:

my_list = [int(line.strip().split(';')[-1]) for line in my_var.split('\n') if line.startswith('Main_data5')]

另请注意,作为一种更加传播的方法,您最好使用str.startswith()方法而不是in运算符。 (关于这种情况,它可能发生在一行中,在行的中间有Main_data5!)

如果您有两个案例来开始该行,您可以使用or运算符和两个startswith字符。

my_list = [int(line.strip().split(';')[-1]) for line in my_var.split('\n') if line.startswith('Main_data5') or line.startswith('Main_data1')]

但是如果你有更多的关键词,你可以使用正则表达式。例如,如果你想匹配统计数据与Main_data的所有线索,后跟一个数字,你可以使用re.match()

import re
my_list = [int(line.strip().split(';')[-1]) for line in my_var.split('\n') if re.match(r'Main_data\d.*',line)]

答案 2 :(得分:0)

 my_list = []
 for line in my_var.strip().split('\n):
     if "Main_data1" in line:
         my_list.append(int(line.split(";")[-1]))
     else:
         continue

或者您可以使用startswith('匹配)'功能就像有人提到的那样。

答案 3 :(得分:0)

我的方法是正则表达式,因为它可以更多地控制模式 -

文件内容

**** SOME JUNK DATA ****
**** SOME JUNK DATA ****
**** SOME JUNK DATA ****
Main_data1;a;b;c;dss;e;1
Main_data2;aa;bb;sdc;d;e;2
Main_data3;aaa;bbb;ccce;d;e;3
Main_data4;aaaa;bbbb;cc;d;e;4
Main_data5;aaaaa;bbbbb;cccc;d;e;523233
**** SOME JUNK DATA ****
**** SOME JUNK DATA ****
**** SOME JUNK DATA ****
**** SOME JUNK DATA ****
**** SOME JUNK DATA ****
**** SOME JUNK DATA ****
Main_data1;a;b;c;dss;e;1
Main_data2;aa;bb;sdc;d;e;2
Main_data3;aaa;bbb;ccce;d;e;3
Main_data4;aaaa;bbbb;cc;d;e;4
Main_data5;aaaaa;bbbbb;cccc;d;e;523233
**** SOME JUNK DATA ****
**** SOME JUNK DATA ****
**** SOME JUNK DATA ******** SOME JUNK DATA ****
**** SOME JUNK DATA ****
**** SOME JUNK DATA ****
Main_data1;a;b;c;dss;e;1
Main_data2;aa;bb;sdc;d;e;2
Main_data3;aaa;bbb;ccce;d;e;3
Main_data4;aaaa;bbbb;cc;d;e;4
Main_data5;aaaaa;bbbbb;cccc;d;e;523233
**** SOME JUNK DATA ****
**** SOME JUNK DATA ****
**** SOME JUNK DATA ******** SOME JUNK DATA ****
**** SOME JUNK DATA ****
**** SOME JUNK DATA ****

代码

import re

fl = open(r"C:\text.txt",'rb')
pattern = r'Main_data.*(?<=;)([0-9]{1,})'
data = []
for line in fl.readlines():
    #match all  the digits that have ; before and line starts with Main_data
    if re.search(pattern, line, re.IGNORECASE | re.MULTILINE):
        data.append(re.search(pattern, line, re.IGNORECASE | re.MULTILINE).group(1))
    else:
        data.append('N')
strng = ','.join(data)#get string of the list

lsts = re.findall(r'(?<=,)[0-9,]+(?=,)',strng)# extracts values and excludes 'N'

outpt = [i.split(',') for i in lsts]# generate final list

print outpt

输出

[['1', '2', '3', '4', '523233'], ['1', '2', '3', '4', '523233'], ['1', '2', '3', '4', '523233']]