user2736211
user2736211

Reputation: 153

Python: How do I save generator output into text file?

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

Answers (2)

CervEd
CervEd

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

blakev
blakev

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

Related Questions