我是脚本新手.我有一张桌子(
Table1.txt
),我需要创建另一个表,该表的Table1行按列排列,反之亦然.对于Perl和SQL,我找到了解决此问题的方法,但是对于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])
但是似乎没有这样的命令,而且我还没有找到将行写为列的另一种方法。
- 2021-1-111 #
- 2021-1-112 #
@Ashwini的答案很完美.魔术发生在
zip(*lis)
让我解释一下它为什么起作用:zip接收(在最简单的情况下)两个列表,然后"压缩"它们:
zip([1,2,3], [4,5,6])
将成为[(1,4), (2,5), (3,6)]
.因此,如果您将外部列表视为矩阵,将内部元组视为行,则这是一种换位(即,我们将行变成了列).现在,
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
我们面临的问题是,在您的情况下,我们不知道我们想传递给
zip
多少个参数 .但是至少,我们已经知道了这些论点:它们是lis
的要素 !lis
是一个列表,该列表的每个元素也都是一个列表(对应于输入文件中的一行数字).维兹威兹 只是Python告诉函数的一种方法"请使用以下所有元素作为参数,而不是事物本身!"所以
*
与
完全相同lis = [[1,2,3], [4,5,6]] zip(*lis)
恭喜,您现在是Python专业人士! ;-)
- 2021-1-113 #
既然我们在谈论列,行和转置,也许值得一提
zip([1,2,3], [4,5,6])
numpy
- 2021-1-114 #
这是一种方法,为简单起见,假设您只想按顺序print出对象:
>>> 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]]) >>> x.T 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
- 2021-1-115 #
只需在@Akavall答案上构建,如果您想从文件中读取,转置然后再次保存就可以了:
for i in range(len(buffer[0])): writer.writerow([buffer[j][i] for j in range(len(buffer))])
from numpy import genfromtxt, savetxt data = genfromtxt('in.txt') savetxt('out.txt',data.T)
第三行是数据转置的位置。data.T
相关问题
- python:比较两个CSV文件并搜索相似的项目pythoncsvcompare2021-01-12 01:29
一般而言,转置可迭代序列的解决方案是:zip(* original_list)< / p>
样本输入:
program:
output: