Помещение строк из файла в несколько переменных, создающих странные противоречия - PullRequest
0 голосов
/ 02 апреля 2019

Прежде чем я попытаюсь объяснить это, вот код, с которым я сейчас работаю:

currentLine = 1
try:
    with open(filename, 'r') as f:
        for line in f:
            if currentLine == 1:
                tempName = line
            if currentLine == 2:
                tempColour = line
            if currentLine == 3:
                tempAge = line
            if currentLine == 4:
                tempWeight = line
                currentLine = 1
                tempSheep = Sheep(tempName, tempColour, tempAge, tempWeight)
                sheepList.append(tempSheep)
            currentLine = currentLine + 1
except:
    print("file is in an invalid format")
    continue
else:
    break

Цель кода - прочитать 4 строки из файла (имя, цвет, возраст и вес) и поместить их в объект Sheep. Это должно быть сделано в цикле, поскольку в каждом файле может быть от 2 до 10 овец. Код в основном работает, так как он читает строки и помещает их в класс, но не читает правильные строки. Когда я распечатываю всех овец, каждую овцу с тем же именем, «боб», это имя первой овцы в файле и первая строка. Кроме того, он на самом деле работает, но он полностью игнорирует переменную name, просто помещая в нее bob. Я заканчиваю с этим беспорядком овец по имени Боб.

например, пример вывода выглядит так:

Name: bob
Colour: blue
age: 5
weight: 50

name: bob
Colour: tina
age: red
Weight: 7

name: bob
colour: 75
age: shirley
Weight: green

в случае, если это не очевидно, все компенсируется игнорированием имени. Я надеюсь, что это было объяснено достаточно хорошо, если вам понадобится дополнительное объяснение, я могу попытаться добавить еще несколько примеров.

почему моя программа плохая?

Ответы [ 2 ]

4 голосов
/ 02 апреля 2019
        if currentLine == 4:
            tempWeight = line
            currentLine = 1
            tempSheep = Sheep(tempName, tempColour, tempAge, tempWeight)
            sheepList.append(tempSheep)
        currentLine = currentLine + 1

Когда этот блок if выполняется, он изначально устанавливает currentLine в единицу. Затем выполняется currentLine = currentLine + 1, устанавливая его равным 2. Это означает, что к тому времени, когда вы снова достигнете вершины цикла, проверка if currentLine == 1: никогда не будет успешной.

Попробуйте вместо этого установить currentLine на ноль.

        if currentLine == 4:
            tempWeight = line
            currentLine = 0
            tempSheep = Sheep(tempName, tempColour, tempAge, tempWeight)
            sheepList.append(tempSheep)
        currentLine = currentLine + 1

... Но вам лучше не пропускать блоки if полностью. Если каждая из ваших записей ровно в четыре строки, вы можете извлечь каждую из них, используя один из рецептов из Как разделить список на куски одинакового размера? . Затем вы можете передать данные в конструктор Sheep посредством распаковки аргументов.

def chunks(l, n):
    """Yield successive n-sized chunks from l."""
    for i in range(0, len(l), n):
        yield l[i:i + n]

with open(filename) as f:
    lines = [line.strip() for line in f]

sheepList = []
for group in chunks(lines, 4):
    sheepList.append(Sheep(*group))
1 голос
/ 02 апреля 2019

Бизнес по отслеживанию ваших файловых линий усложняет задачу.Вы можете использовать enumerate, чтобы сделать вещи немного проще, и просто использовать оператор по модулю%, чтобы сгруппировать вещи по 5 (каждый набор имен находится в группах по 5 строк):

for i, line in enumerate(f, start=1): # Start numbering at 1
    currentLine = i % 5 # At line 5, blank, this will be zero
    if not currentLine: # 0 acts as False
        continue

    # if elif else makes things a bit more efficient
    # as it's not possible for you to have multiple line number
    # possibilities
    if currentLine == 1:
       tempName = line
    elif currentLine == 2:
       tempColour = line
    elif currentLine == 3:
       tempAge = line
    else:
       tempWeight = line
       tempSheep = Sheep(tempName, tempColour, tempAge, tempWeight)
       sheepList.append(tempSheep)

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