我有一个文件,在从我命名为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:我不想从底部读取文件。
答案 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));
没有更多的选择来解决这类问题。
您也可以使用tell
和seek
方法来玩,但通常不需要忍者:)。
如果您使用大文件,请不要忘记使用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"))