Python nested loop - get next N lines
loops, nested, python
Solution
Based on window example from old docs you can use something like:
from collections import deque
from itertools import cycle
try:
xrange
except NameError: # python3
xrange = range
def pack(d):
tup = tuple(d)
return zip(cycle(tup[0:1]), tup[1:])
def window(seq, n=2):
it = iter(seq)
d = deque((next(it, None) for _ in xrange(n)), maxlen=n)
yield pack(d)
for e in it:
d.append(e)
yield pack(d)
Demo:
>>> for l in window([1,2,3,4,5], 4):
... for l1, l2 in l:
... print l1, l2
...
1 2
1 3
1 4
2 3
2 4
2 5
So, basically you can pass your file to window to get desired result:
window(open('C:/working_file.txt', mode='r', encoding='utf8'), 4)
Problem
I'm new to Python and trying to do a nested loop. I have a very large file (1.1 million rows), and I'd like to use it to create a file that has each line along with the next N lines, for example with the next 3 lines: ``` 1 2 1 3 1 4 2 3 2 4 2 5 ``` Right now I'm just trying to get the loops working with rownumbers instead of the strings since it's easier to visualize. I came up with this code, but it's not behaving how I want it to: ``` with open('C:/working_file.txt', mode='r', encoding = 'utf8') as f: for i, line in enumerate(f): line_a = i lower_bound = i + 1 upper_bound = i + 4 with open('C:/working_file.txt', mode='r', encoding = 'utf8') as g: for j, line in enumerate(g): while j >= lower_bound and j <= upper_bound: line_b = j j = j+1 print(line_a, line_b) ``` Instead of the output I want like above, it's giving me this: ``` 990 991 990 992 990 993 990 994 990 992 990 993 990 994 990 993 990 994 990 994 ``` As you can see the inner loop is iterating multiple times for each line in the outer loop. It seems like there should only be one iteration per line in the outer loop. What am I missing? EDIT: My question was answered below, here is the exact code I ended up using: ``` from collections import deque from itertools import cycle log = open('C:/example.txt', mode='w', encoding = 'utf8') try: xrange except NameError: # python3 xrange = range def pack(d): tup = tuple(d) return zip(cycle(tup[0:1]), tup[1:]) def window(seq, n=2): it = iter(seq) d = deque((next(it, None) for _ in range(n)), maxlen=n) yield pack(d) for e in it: d.append(e) yield pack(d) for l in window(open('c:/working_file.txt', mode='r', encoding='utf8'),100): for a, b in l: print(a.strip() + '\t' + b.strip(), file=log) ```