如何做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
在第三行是数据转置的地方。