Как вернуть несколько строк с Python каждый раз, когда вызывается next ()? - PullRequest
0 голосов
/ 04 мая 2018

привет я новичок в python, есть простой вопрос. меня просят написать генератор для обхода текстового файла, каждая строка в файле - 3 координаты точки (x, y, z) как вернуть 5 баллов (5 строк) каждый раз, когда вызывается next ()?

вот мой код, я могу генерировать только одну строку каждый раз спасибо!

import itertools

def gen_points(name):
    f=open(name)
    for l in f:
            clean_string=l.rstrip()
            x,y,z=clean_string.split()
            x= float(x)
            y= float(y)
            z= float(z)
            yield x,y,z
    f.close()

file_name=r"D:\master ppt\Spatial Analysis\data\22.txt"
a=gen_points(file_name)
g=itertools.cycle(a)

print(next(g))

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Вам не нужно сразу уступать, поэтому держитесь за выход, а потом отдайте его:

## Adding batchsize so you can change it on the fly if you need to
def gen_points(name, batchsize = 5):
    ## The "with" statement is better practice
    with open(name,'r') as f:
        ## A container to hold the output
        output = list()
        for l in f:
            clean_string=l.rstrip()
            x,y,z=clean_string.split()
            x= float(x)
            y= float(y)
            z= float(z)
            ## Store instead of yielding
            output.append([x,y,z])
            ## Check if we have enough lines
            if len(output) >= batchsize:
                yield output
                ## Clear list for next batch
                output = list()

        ## In case you have an "odd" number of points (i.e.- 23 points in this situation)
        if output: yield output
0 голосов
/ 04 мая 2018

просто подождите, пока в вашем списке триплетов не окажется пять элементов, и вместо этого выдайте:

def gen_points(name):
    with open(name) as f:
        five_items = []
        for l in f:
            five_items.append(tuple(map(float,l.split())))
            if len(five_items) == 5:
                yield five_items
                # create another empty object
                five_items = []
        if five_items:
            yield five_items

также yield в конце цикла, если он не пустой, чтобы не потерять последние элементы, если число элементов не делится на 5.

В сторону: clean_string=l.rstrip() был бесполезен, поскольку split уже заботится о переводах строки и еще много чего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...