我有这个文件:
<< 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'
答案 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