我有一个变量,它保存的内容与此
有些相似**** 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多行。什么是一种有效的方法呢
答案 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']]