我编写了一个脚本,用于将制表符分隔的矩阵(带标题)重新格式化为“长格式”。见下面的例子。它正确执行任务但似乎陷入了无休止的循环......
输入示例:
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...
答案 0 :(得分:4)
您的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
它不会按您想要的顺序打印行,但它可以获得正确的基础知识。
以下是我将如何做到这一点。我看到这与Ashwini Chaudhary所发布的类似,但更为笼统:
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
答案 1 :(得分:3)
j+=1
在while循环之外,正如发送者的回答所说的那样。
其他改进可以是:
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]