我正在使用像这样的for循环读取文件...
f = open("somefile.txt")
for line in f:
do stuff
除了我读过的每一行,我需要从它前面的行中取一个项目并将它放在当前行中。做这个的最好方式是什么?有没有办法阅读下一行或从中获取一些项目而不阅读它?
答案 0 :(得分:7)
如果我的理解是正确的,并且您希望依次使用下一行中的某些值来处理每一行,我的建议只是存储您当前正在阅读的值,并处理最后一个值。反向工作 - last_line
是您当前的行,行是下一行。
last_line = None
with open("somefile.txt") as f:
for line in f:
if not last_line == None:
do_stuff(last_line, extract_needed_part(line))
last_line = line
do_stuff(last_line) #The final line without anything following it.
在数学术语中,不是行n和行n + 1,而是行n-1和行n。同样的效果。
这种方法的优点是它并不意味着在开始时加载整个文件。
答案 1 :(得分:3)
如果您的文件不是很大,您可以将其读入内存并在那里使用:
f = open("somefile.txt")
lines = f.readlines()
f.close()
for index, value in enumerate(lines):
# Check if next line exists
if index + 1 > len(lines):
next_line = lines(index + 1)
# do something with line and next_line
修改强>
对于大型文件,最简单的方法就是记住上一行:
f = open("somefile.txt")
previous_line = f.readline()
for line in f:
# Do something with line and previous_line
print(line, previous_line)
# Save this line for the next iteration
previous_line = line
可能存在边缘情况,具体取决于数据的外观。您的线路是否成对成对,或者在某些情况下您只需要从下一行获得一些信息。
例如,如果您的文件只有一行,则此代码将不执行任何操作。
答案 2 :(得分:0)
如果您的文件适合内存,您可以尝试这样的事情:
f = open('somefile.txt')
lines = f.read().splitlines()
for current_line, next_line in zip(lines, lines[1:]):
print current_line
print next_line
print '-------'
上面的代码基本上读取所有行,并使用zip
创建包含当前行和下一行的元组列表。
编辑:或者,对于长文件,您可以使用itertools
库,如下所示:
import itertools
f = open('somefile.txt')
i1, i2 = itertools.tee(f)
lines = itertools.izip(i1, itertools.islice(i2, 1, None))
for current_line, next_line in lines:
print current_line
print next_line
print '-------'
在这种情况下:
itertools.tee
用于创建两个使用原始文件迭代器的独立迭代器(一个用于当前行,一个用于下一行)。itertools.slice
用于启动第二行中的下一行迭代器。itertools.izip
用于在元组中逐行连接两个迭代器的结果。编辑2:根据@eyquem的建议,您也可以打开文件两次:
import itertools
f = open('somefile.txt')
g = open('somefile.txt')
lines = itertools.izip(f, itertools.islice(g, 1, None))
for current_line, next_line in lines:
print current_line
print next_line
print '-------'
答案 3 :(得分:0)
with open('somefile.txt') as f, open('somefile.txt') as g:
g.readline()
lines = ( (f.readline(),line) for line in g)
for precline,aheadline in lines:
# do what you want