如何做csv表中的数据的行到列转换?

我不熟悉脚本。 我有一个表( Table1.txt ),我需要创build另一个Table1行按行排列,反之亦然。 我已经find了Perl和SQL的这个问题的解决scheme,但不是Python。

我刚刚开始学习Python两天前,所以这是我得到:

 import csv import sys with open(sys.argv[1], "rt") as inputfile: readinput = csv.reader(inputfile, delimiter='\t') with open("output.csv", 'wt') as outputfile: writer = csv.writer(outputfile, delimiter="\t") for row in readinput: values = [row[0], row[1], row[2], row[3]] writer.writerow([values]) 

这只是将列再现为列。 我现在想要做的是写最后一行作为writer.writecol([values])但似乎没有这样的命令,我还没有find另一种方式写行作为列。

一般来说,转换迭代序列的解决scheme是:zip(* original_list)

样本input:

 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 

程序:

 with open('in.txt') as f: lis = [x.split() for x in f] for x in zip(*lis): for y in x: print(y+'\t', end='') print('\n') 

输出:

 1 6 11 2 7 12 3 8 13 4 9 14 5 10 15 

@ Ashwini的答案是完美的。 魔术发生在

 zip(*lis) 

让我解释为什么这个工作:拉链(最简单的情况下)两个列表和“拉链”: zip([1,2,3], [4,5,6])将变成[(1,4), (2,5), (3,6)] 。 所以,如果你认为外层列表是一个matrix,内层元组是行,那么这是一个换位(即,我们把行转换为列)。

现在, zip是一个任意的arity的函数,所以它可能需要两个以上的参数:

 # Our matrix is: # 1 2 3 # 4 5 6 # 7 8 9 zip([1,2,3], [4,5,6], [7,8,9]) >>> [(1, 4, 7), (2, 5, 8), (3, 6, 9)] # Now it is # 1 4 7 # 2 5 8 # 3 6 9 

我们面临的问题是,在你的情况下,我们不知道我们要传递多less参数。 但至less,我们已经知道了这些论点:他们是李的元素! lis是一个列表,列表中的每个元素也是一个列表(对应于input文件中的一行数字)。 *只是Pythons的一种告诉函数的方式, “请使用下面的任何一个元素作为你的论点,而不是这个东西本身!”

所以

 lis = [[1,2,3], [4,5,6]] zip(*lis) 

是完全一样的

 zip([1,2,3], [4,5,6]) 

恭喜,现在你是Python专家! 😉

既然我们在谈论列,行和转置,可能值得一提的是numpy

 >>> import numpy as np >>> x = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]]) >>> x array([[ 1, 2, 3], [ 4, 5, 6], [ 7, 8, 9], [10, 11, 12]]) >>> xT array([[ 1, 4, 7, 10], [ 2, 5, 8, 11], [ 3, 6, 9, 12]]) 

这里有一个方法可以做到这一点,为简单起见,你只需要打印出对象的顺序:

  # lets read all the data into a big 2d array buffer = [] for row in readinput: values = [row[0], row[1], row[2], row[3]] buffer.append(values) # what you have in your code for i in range(len(buffer)): for j in range(len(buffer[0])): print buffer[i][j] # this is called a transpose; we have buffer[i][j] to read row then column, # switch i and j around to do the opposite for i in range(len(buffer[0])): for j in range(len(buffer)): print buffer[j][i] 

既然你需要一个数组传递给writer.writerow ,你可以这样做

  for i in range(len(buffer[0])): writer.writerow([buffer[j][i] for j in range(len(buffer))]) 

只需构build@Akavall答案,如果你想从文件中读取,转置,然后再保存只是做:

 from numpy import genfromtxt, savetxt data = genfromtxt('in.txt') savetxt('out.txt',data.T) 

data.T在第三行是数据转置的地方。