问题:
输入是一个制表符分隔的文件。行是变量,列是样本。变量可以采用三个值 (00,01,11),并按照需要维护的顺序 (v1->vN) 列出。行数多,列数多,所以需要分块读取输入文件。
输入如下所示:
s1 s2 s3 s4 v1 00 00 11 01 v2 00 00 00 00 v3 01 11 00 00 v4 00 00 00 00 (...)
我想要做的是将输入分成几行的片段,其中片段足够大,样本每个都是唯一的。在上面的例子中,从 v1 开始,第一个块应该在 v3 结束,因为在那个点有足够的信息,样本是唯一的。下一个块将从 v4 开始并重复该过程。到达最后一行时任务结束。块应打印在输出文件中。
我的尝试:
我试图做的是使用 csv 模块生成一个由列表组成的数组,每个列表包含所有样本的单个变量 (00,01,00) 的状态。或者,通过旋转输入,为每个变量创建包含样本状态的列表。我在问工作是否应该集中在列或行上,即是否更好地使用 v1=['00','00','11','01'] 或 s1=['00',' 00','01','00',...]
以下代码是指我试图将列问题更改为行问题的旋转操作。(对不起笨拙的python语法,这是我能做的最好的)
my_infilename='my_file.txt'
csv_infile=csv.reader(open(my_infilename,'r'), delimiter='\t')
out=open('transposed_'+my_infilename, 'w')
csv_infile=zip(*csv_infile)
line_n=0
for line in csv_infile:
line_n+=1
if line_n==1: #headers
continue
else:
line=(','.join(line)+'\n') #just to make it readable to me
out.write(line)
out.close()
解决这个问题的最佳方法是什么?旋转有什么帮助吗?有没有我可以依赖的内置功能?