如何在python中选择文本文件的特定行?

时间:2015-01-28 16:56:43

标签: python

我现在有两个问题:文本文件:

a)第一个:我有一个文本文件(这是一个日志),这个日志有很多行:2221。我只想从第2211行打印到2220.我怎么能这样做?

我有这段代码:

line_number=2011
with open('file.log') as f:
        i = 2011
        for line in f:
            if i == line_number:
                break
            i += 1
            print (line)

但打印所有文件

b)第二:嗯,第2211至2220行是:

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

我想创建一个代码,用于选择编号最小的数字行(标识),并读取.pdb的名称(只有编号最小的行的24个字符)。因此,我需要识别具有最小编号的.pdb是什么,并在其他脚本中像字符串一样使用它,如下所示:

模型= '%s' 的%R

其中'%s'%R是我需要的.pdb名称

我该怎么做?

4 个答案:

答案 0 :(得分:1)

当您到达感兴趣的线条时,您的代码只会中断,但您没有与打印相关联的条件,因此它会打印它遇到的每一行。如果您将代码更改为:

start = 2011
end = 2220

with open('file.log') as f:
    for line_number, line in enumerate(f):
        if line_number > end:
            break
        if line_number > start:
            print line

您可以将文件句柄视为列表并对其进行切片:

with open('file.log') as f:
    print "".join(list(f)[2011:2220])

答案 1 :(得分:1)

with open('file.log') as f:
    print f.read().split('\n')[2211:2220+1] 

首先创建文本文件中所有行的列表(行由新行字符(“\ n”)分隔,然后对列表进行切片,就像那样。

编辑:或者你可以使用bulit-in函数“readlines”如果你不介意最后的'\ n':

with open('file.log') as f:
    print f.readlines()[2211:2220+1]

<强> B:

def s(item):
    return item[num_of_spaces:]
num_of_spaces = len("Dominio1.BL00010001.pdb         ")
with open('file.log') as f:
    lines = f.read().split('\n')[2211:2221]
print sorted(lines, key=s)[0]

这应该有效

答案 2 :(得分:0)

with open('file.log') as f:
        rd=f.readlines()
        print (rd[2211:2221])

readlines()返回一个列表,所以只需用索引对列表进行切片。从0开始的索引和最后一个数字不算,所以你必须写2220 + 1.

答案 3 :(得分:0)

你的代码片段的问题是你总是打印你读到的行,直到你到达所需的行,然后你打破了循环!试试这个

line_number=2011
with open('file.log') as opened_file:
     for i, line in enumerate(opened_file):
         # Only print it if you got to the desired line or upper
         if i >= line_number:
             print(line)

但是,有更好的解决此问题的方法,特别是如果您正在处理大型文件。看看this question

如果你想取名字我建议分割线,你可以写:

columns = line.split()
print('File name is', columns[0])

因此,每个行['Dominio1.BL00010001.pdb', '24.69530']都会得到这样的列表。