Reputation: 153
I am using the following generator to calculate a moving average:
import itertools
from collections import deque
def moving_average(iterable, n=50):
it = iter(iterable)
d = deque(itertools.islice(it, n-1))
d.appendleft(0)
s = sum(d)
for elem in it:
s += elem - d.popleft()
d.append(elem)
yield s / float(n)
I can print the generator output, but I can't figure out how to save that output into a text file.
x = (1,2,2,4,1,3)
avg = moving_average(x,2)
for value in avg:
print value
When I change the print line to write to a file, output is printed to the screen, a file is created but it stays empty.
Thanks in advance.
Upvotes: 15
Views: 23596
Reputation: 4253
Since you are using a generator, you can use file.writelines()
, which writes an iterable of strings to a file.
You may want to combine your generator with a line generator, to do string conversion and add newlines.
from collections.abc import Iterator
from os import linesep
from sys import stdout
def generator(n: int) -> int:
for x in range(n):
yield x
def line_generator(iterable) -> Iterator[str]:
"""Takes an iterable and generates lines"""
for x in iterable:
yield str(x) # Convert to string
yield linesep # Bring your own line-endings
stdout.writelines(line_generator(generator(10)))
Upvotes: 1
Reputation: 4459
def generator(howmany):
for x in xrange(howmany):
yield x
g = generator(10)
with open('output.txt', 'w') as f:
for x in g:
f.write(str(x))
with open('output.txt', 'r') as f:
print f.readlines()
output:
>>>
['0123456789']
Upvotes: 21