通过大于列表中的语句来提取信息(Python)

时间:2015-04-10 15:23:53

标签: python

我使用csv模块从数据文件创建列表。它现在看起来像这样:

['unitig_5\t.\tregion\t401\t500\t0.00\t+\t.\tcov2=3.000', '0.000;gaps=0',
    '0;cov=3', '3', '3;cQv=20', '20', '20;del=0;ins=0;sub=0']

['unitig_5\t.\tregion\t2201\t2300\t0.00\t+\t.\tcov2=10.860',
    '1.217;gaps=0', '0;cov=8', '11', '13;cQv=20', '20', '20;del=0;ins=0;sub=0']

如果cov2=(上面第一列的一部分)等于大于某个指定整数(比如140)的某个数字,我需要提取列表并将它们放入一个新文件中,那么在这种情况下上面的两个列表将不被接受。

如何设置它以检查哪些列表符合此限定条件并将这些列表放入新文件?

4 个答案:

答案 0 :(得分:0)

您可以使用regex

>>> l=['unitig_5\t.\tregion\t401\t500\t0.00\t+\t.\tcov2=3.000', '0.000;gaps=0',
...     '0;cov=3', '3', '3;cQv=20', '20', '20;del=0;ins=0;sub=0']

>>> import re
>>> float(re.search(r'cov2=([\d.]+)',l[0]).group(1))
3.0

模式r'cov2=([\d.]+)'将匹配数字组合(\d)和长度为1或更长的点。然后你可以将结果转换为float并比较:

>>> var=float(re.search(r'cov2=([\d.]+)',l[0]).group(1))
>>> var>140
False

另外,由于您的正则表达式可能与模式不匹配,您可以使用try-except来处理异常:

try :

    var=float(re.search(r'cov2=([\d.]+)',l[0]).group(1))
    print var>140

except AttributeError:
    #print 'the_error_message'

答案 1 :(得分:0)

我首先用标签“\ t”拆分第一个字符串,这似乎将字段分开。 然后,如果cov2总是最后一个fild,那么进一步解析将很容易(剪切“cov2 =”,然后将余数转换为float并进行比较。

如果不一定是最后一个字段,那么简单搜索一下就足够了。 当然,如果需要进行错误检查或更宽容的搜索,复杂性可能会无法增加。

答案 2 :(得分:0)

lst = [ ['unitig_5\t.\tregion\t401\t500\t0.00\t+\t.\tcov2=3.000', '0.000;gaps=0',
    '0;cov=3', '3', '3;cQv=20', '20', '20;del=0;ins=0;sub=0'],
        ['unitig_5\t.\tregion\t2201\t2300\t0.00\t+\t.\tcov2=10.860',
    '1.217;gaps=0', '0;cov=8', '11', '13;cQv=20', '20', '20;del=0;ins=0;sub=0'], ]

filtered_list = [ l for l in lst if re.match('.*cov2=([\d.]+$'), l) ]

答案 3 :(得分:0)

如果所有第一个元素都包含子字符串,则可以使用rsplit提取浮点值:

for row in list_of_rows:
    if float(row[0].rsplit("=",1)[1]) > 140:
            # write rows

如果您实际上并不需要每一行,那么当您第一次阅读文件时,您应该这样做。

with open("input.csv") as f, open("output.csv", "w") as out:
    r = csv.reader(f)
    wr = csv.writer(out)
    for row in r:
        if float(row[0].rsplit("=", 1)[1]) > 140:
            wr.writerows(row)