如何在Python中对行进行排序并提取信息?

时间:2015-01-28 21:44:24

标签: python

我有这个文件:

<< end of ENERGY.
iupac_m_486_> OE1/2 will be swapped:     -136.1396        1     1
openf___224_> Open           Dominio1.BL00100001.pdb
wrpdb___568_> Residues, atoms, selected atoms:      268     2115     2115

>> Summary of successfully produced loop models:
Filename                          molpdf
----------------------------------------
Dominio1.BL00010001.pdb         24.69530
Dominio1.BL00020001.pdb         14.33748
Dominio1.BL00030001.pdb         30.53454
Dominio1.BL00040001.pdb         23.82516
Dominio1.BL00050001.pdb         27.48684
Dominio1.BL00060001.pdb         18.17364
Dominio1.BL00070001.pdb         30.98407
Dominio1.BL00080001.pdb         17.19927
Dominio1.BL00090001.pdb         19.02460
Dominio1.BL00100001.pdb         22.57086

我想排序最后10行并找到与最小数字相关联的文件名,以便在我的脚本的第二部分中使用它。

在上面的示例文件中,我想要的文件名是Dominio1.BL00020001.pdb,因为它与最小的数字相关联,但我想以编程方式找到它。

此代码只显示我需要排序的行

import itertools
with open('%s'%W, "r") as text_file:
    for line in itertools.islice(text_file, 2210, 2220):
        print line
CREATE CODE..(please Can somebody help me to do it?)

并发现Dominio1.BL00020001.pdb的编号最小并继续阅读并将其设置为&#34; a&#34;,我不能这样使用:

model_initial= '%s'%a'

3 个答案:

答案 0 :(得分:0)

这样的事情:

import re
def yield_items(filename):
  with open(filename) as f:
    for line in f:
      if re.match(r'\S+[.]pdb\s+(\d[\d.]+)(?:\s|\Z)', line):
        items = line.split()
        yield float(items[1]), items[0]
print min(yield_items('input.txt'))

与gboffi和Malik Brahimi的解决方案相比,此解决方案使用更少的内存:它一次仅使用1行内存,因此即使文件包含大量匹配行,此解决方案也不会。 t同时在内存中保留1个以上。

答案 1 :(得分:0)

我使用Python re

file.txt

Dominio1.BL00010001.pdb         24.69530
Dominio1.BL00020001.pdb         14.33748
Dominio1.BL00030001.pdb         30.53454
Dominio1.BL00040001.pdb         23.82516
Dominio1.BL00050001.pdb         27.48684
Dominio1.BL00060001.pdb         18.17364
Dominio1.BL00070001.pdb         30.98407
Dominio1.BL00080001.pdb         17.19927
Dominio1.BL00090001.pdb         19.02460
Dominio1.BL00100001.pdb         22.57086

sorts.py

import re

lines = open('file.txt').readlines() # readlines
lines = [i.strip() for i in lines] # remove newlines

lines = [re.sub('\s+', ' ', i) for i in lines] # remove extra spaces
lines = [i.split(' ') for i in lines] # split by space
lines = sorted(lines, key = lambda i: float(i[1])) # sort by id

print lines[0][0] # print item with least id

答案 2 :(得分:0)

当我们有有趣的行时,将使用以下函数。

我们要清理线条,剥去边缘的空白区域,然后将其分为两部分,即文件名和相关值。

这还不够,因为我们接下来要做的就是按数字排序,所以我们将数字字符串转换为float并返回由float和文件名组成的元组。

def float_name(line):
    fname, number = line.strip().split()
    return float(number), fname

在上面的函数的基础上,我们编写了一个处理数据的函数(请注意,数据只是一个包含字符串的迭代,可能是列表或文件对象)。

使用列表理解,我们扫描数据,如果当前行l以所需的密钥initial开头,我们认为它很有趣并将其传递给{ {1}}。然后对结果的元组列表进行排序,并将排序后的列表返回给调用者。

float_name

现在是时候将我们的功能付诸实践了,

def sort_floats_names(data,initial):
     floats_names = [float_name(l) for l in data if l.startswith(initial)]
     floats_names.sort()
     return floats_names

第一行构建sorted_floats_names = sort_floats_names(open('your_data.txt'), 'Dominio1') model_initial = sorted_floats_names[0][1] 元组的排序列表,第二行将名称(float, fname)分配给排序列表中第零个元组的文件名组件。

附录:以上所有代码作为单行

model_initial