Прочитайте файл, затем остановитесь, затем продолжайте до указанной строки - PullRequest
0 голосов
/ 17 марта 2020

Python 3.7 вопрос.

У меня есть файл, похожий на этот: 1 10 10 10 3 25 29 10 52 55 30 70 70 20 0

, где 1 показывает, что будет 1 строка, 3 показывает 3 придет, 0 отмечает конец файла. Как этого добиться?

Я пытался

def read_each_course(filename):
    with open(filename, 'r') as f:
        lines = []
        content = f.readlines()
        lines += [x.rstrip() for x in content]
    for i in lines:
        while True:
            if str(i).count(" ") == 0:
                lines_to_read = int(i)
                break
        return lines_to_read, next(i)

, но это не сработает, я получаю

TypeError: 'str' object is not an iterator
 for the next(i).

Моя идея состояла в том, чтобы получить список списков как элементы типа: [[1, [10, 10, 10]], [3, [25, 29, 10], [52, 55, 30], [70, 70, 20]]]

НО, я не уверен, что этот дизайн является хорошей идеей в целом? Или же тогда это должен быть скорее единый связанный список, поскольку конечная цель состоит в том, что, поскольку 3 числа являются координатами, мне придется использовать только следующий элемент, такой как x2-x1, y2-y1, штраф, если его опустить (дополнительная стоимость) где общая стоимость - гип. из ху треугольника, что хорошо, я могу рассчитать это.

Ответы [ 2 ]

0 голосов
/ 17 марта 2020

Эта версия ответа RomainL упрощает логику c.

. Для анализа файла используются итераторы.

def read_each_course(filename):

    result = []
    with open(filename) as f:
        it = iter(f)
        while True:
            count = int(next(it))

            if count == 0:         # Found the stop marker
                break

            current = [count]
            for _ in range(count):
                current.append([int(v) for v in next(it).strip().split()])
            result.append(current)
    return result


print(read_each_course("file2.txt"))

Вывод по мере необходимости.

0 голосов
/ 17 марта 2020

этот код должен сработать, для вашего вопроса о дизайне, я понятия не имею, он кажется мне основанным на мнении. Поэтому я сосредоточусь на коде.

В ваших строках кода есть список, а я - элемент этого списка. Вы звоните дальше по одному из списка элементов, а не по списку здесь. Я должен признать, что я не понимаю логи c вашего кода. Поэтому я не могу помочь.

def read_each_course(filename):

    result = []
    current = []
    with open(filename) as f_in:

        for line in f_in:  # loop  over the file line by line

            spt = line.strip().split()  # split
            if len(spt) == 1: # one elem

                if current: # not the first one
                    result.append(current)
                    current = []

                if spt[0] == 0: # end of file
                    break

                current.append(int(spt[0]))

            else:
                current.append(list(map(int, spt)))

    return result
...