0

I wrote a script to reformat a tab-delimited matrix (with header) into a "long format". See example below. It performs the task correctly but it seems to get stuck in an endless loop...

Example of input:

WHO   THING1    THING2
me    me1       me2
you   you1      you2

Desired output:

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

Here is the code:

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

I think it has to do with my exit command (j = False). Any ideas?

edit: Thanks for suggestions. I think a typo in my initial posting led to some confusion, sorry about that For now I have employed a simple solution:

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...
4

2 に答える 2

4

あなたj += 1whileループの外にあるので、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
于 2012-07-05T22:26:16.457 に答える
3

j+=1sentleの答えが言うようにwhileループの外にあります。

その他の改善点は次のとおりです。

  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]
于 2012-07-05T22:34:45.767 に答える