如何使用python从文件中读取当前行上方的特定行

时间:2018-04-19 10:23:32

标签: python file

我有一个文件,在从我命名为current_line的文件中读取一行后,我想获取current_line上方的第4行。如何使用python完成?

line 1
line 2
line 3
line 4
line 5
line 6

现在说我已经获得第6行并且已经制作了

current_line = line 6

现在我想从上面开始4行(即)N现在想要第2行

output_line = line 2

PS:我不想从底部读取文件。

7 个答案:

答案 0 :(得分:3)

您可以在迭代文件行的同时保留最后4行的列表。一个好方法是使用最长为4的deque

from collections import deque

last_lines = deque(maxlen=4)

with open('test.txt') as f:
    for line in f:
        if line.endswith('6\n'): # Your real condition here
            print(last_lines[0])  
        last_lines.append(line)

#  Output:
# line 2
  

一旦有限长度双端队列已满,当添加新项目时,a   从对面丢弃相应数量的项目。

我们逐行读取文件,只在内存中保留所需的行。

想象一下,我们刚刚读过第10行。我们在队列中有第6行到第9行。

如果满足条件,我们在队列开始处检索第6行并使用它。

我们将第10行附加到双端队列,第一个项目(第6行)被推出,因为我们确信我们不再需要它,我们现在队列中有7到10行。

答案 1 :(得分:1)

我的方法是将内容转换为\n上的列表拆分并按索引检索所需的行。

lines = '''line 1
line 2
line 3
line 4
line 5
line 6'''

s = lines.split('\n')
current_line = 'line 6'

output_line = s[s.index(current_line) - 4]
# line 2

由于您正在阅读文件,因此您无需在\n上明确拆分。您可以使用readlines

从文件中读取行列表
with open('path/to/your_file') as f:
    lines = f.readlines()
    current_line = 'line 6'
    output_line = lines[lines.index(current_line) - 4]
    # line 2

答案 2 :(得分:0)

您可以enumerate使用open()。例如:

with open('path/to/your.file') as f:
    for i, line in enumerate(f):
        # Do something with line
        # And you have the i as index.

要返回i-4行,您可以考虑使用while

但你为什么还要回去?

答案 3 :(得分:0)

你可以这样做:

with open("file.txt") as f:
    lines = f.readlines()

for nbr_line, line in enumerate(lines):
    if line == ...:
        output_line = lines[nbr_line - 4] # !!! nbr_line - 4 may be < 0

答案 4 :(得分:0)

我可以看到你正在逐行阅读文件。我建议你将整个文件读入列表,如下例所示。

打开(&#34; filename.txt&#34;,&#34; r&#34;)为fd:     lines = fd.readlines()#这将读取每一行并将其附加到行列表

lines [line_number]将为您提供受尊重的行。

答案 5 :(得分:0)

f.readLines无效的解决方案。如果您处理大文件,为什么要将所有文件读入内存?

def getNthLine(i):
    if i<1:
        return 'NaN';
    else:
        with open('temp.text', 'r') as f:
            for index, line in enumerate(f):
                if index == i:
                    line = line.strip()
                    return line

f = open('temp.text','r');

for i,line in enumerate(f):
    print(line.strip());
    print(getNthLine(i-1));

没有更多的选择来解决这类问题。 您也可以使用tellseek方法来玩,但通常不需要忍者:)。

如果您使用大文件,请不要忘记使用enumerate

答案 6 :(得分:0)

这是你用发生器做的方法,避免将整个文件读入内存。

更新:根据Thierry Lathuille的推荐使用collections.deque(deque代表“双端队列”)。

import collections

def file_generator(filepath):
    with open(filepath) as file:
        for l in file:
            yield l.rstrip()

def get_n_lines_previous(filepath, n, match):
    file_gen = file_generator(filepath)
    stored_lines = collections.deque('',n)

    for line in file_gen:
        if line == match:
            return stored_lines[0]        
        stored_lines.append(line)

if __name__ == "__main__":
    print(get_n_lines_previous("lines.txt", 4, "line 6"))