Проблема с Python при выходе из цикла while для простого скрипта

Я написал скрипт для переформатирования матрицы с разделителями табуляции (с заголовком) в "длинный формат". Смотрите пример ниже. Он выполняет задачу правильно, но, похоже, застрял в бесконечном цикле...

Пример ввода:

WHO   THING1    THING2
me    me1       me2
you   you1      you2

Желаемый результат:

me    THING1    me1
me    THING2    me2
you   THING1    you1
you   THING2    you2

Вот код:

import csv
matrix_file = open('path')
matrix_reader = csv.reader(matrix_file, delimiter="\t")


j = 1
while j:
    matrix_file.seek(0)
    rownum = 0
    for i in matrix_reader:
        rownum+=1
        if j == int(len(i)):
            j = False
        elif rownum ==1:
            header = i[j]
        else:
           print i[0], "\t",header, "\t",i[j]
    j +=1

Я думаю, что это связано с моей командой выхода (j = False). Есть идеи?

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

valid = True
while valid:
matrix_file.seek(0)
rownum = 0
for i in matrix_reader:
    rownum+=1
    if j == int(len(i)):
        valid = False

    etc, etc, etc...

2 ответа

Решение

j+=1 находится вне цикла while, как говорится в ответе senderle.

Другие улучшения могут быть:

  1. int(len(i)) Просто используйте len(i),как len() всегда возвращает int, так что не нужно int() вокруг него
  2. использование for rownum,i in enumerate(matrix_reader): так что теперь нет необходимости обрабатывать дополнительную переменную rownum, он будет увеличен сам по себе.

РЕДАКТИРОВАТЬ: рабочая версия вашего кода, я не думаю, что есть необходимость while здесь for петли достаточно.

import csv
matrix_file = open('data1.csv')
matrix_reader = csv.reader(matrix_file, delimiter="\t")
header=matrix_reader.next()[0].split() #now header is ['WHO', 'THING1', 'THING2']

for i in matrix_reader:
        line=i[0].split()
        print line[0], "\t",header[1], "\t",line[1]
        print line[0], "\t",header[2], "\t",line[2]

Ваш j += 1 находится за пределами while петля, так j никогда не увеличивается. Если len(i) никогда не меньше 2, тогда у вас будет бесконечный цикл.

Но, как было отмечено, есть другие проблемы с этим кодом. Вот рабочая версия, основанная на вашей идиоме. Я бы сделал много вещей по-другому, но, возможно, вам будет полезно посмотреть, как ваш код мог бы работать:

j = 1
while j:
    matrix_file.seek(0)
    rownum = 0
    for i in matrix_reader:
        rownum += 1
        if j == len(i) or j == -1:
            j = -1
        elif rownum == 1:
            header = i[j]
        else:
           print i[0], "\t", header, "\t", i[j]
    j += 1

Он не печатает строки в нужном вам порядке, но правильно понимает основы.

Вот как бы я это сделал вместо этого. Я вижу, что это похоже на то, что написал Ашвини Чаудхари, но немного более обобщенно:

import csv
matrix_file = open('path')
matrix_reader = csv.reader(matrix_file, delimiter="\t")

headers = next(matrix_reader, '')
for row in matrix_reader:
    for header, value in zip(headers[1:], row[1:]):
        print row[0], header, value
Другие вопросы по тегам