Проблема с 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.
Другие улучшения могут быть:
int(len(i))
Просто используйтеlen(i)
,какlen()
всегда возвращает int, так что не нужноint()
вокруг него- использование
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