我在代码中遇到了一个中间步骤,它需要来自用户的许多输入文件(输入文件的数量取决于用户并且不是固定的)并且将这些文件中的目录作为例如,输入文件如下所示:
输入file1:
COL1 COL2 COL3 COL4 COL5 COL6 COL7 COL8 COL9
NM_032291 chr1 66999824 67210768 1.4612e+01
NM_001080397 chr1 8384389 8404227 1.0545e+01
NM_018090 chr1 16767166 16786584 1.4473e+01
NM_032785 chr1 48998526 50489626 5.4473e-01
NM_001145278 chr1 16767166 16786584 1.0545e+02
NM_013943 chr1 25071759 25170815 1.473e-04
NM_001145277 chr1 16767166 16786584 1.4473e+01
NM_052998 chr1 33546713 33585995 1.4473e+02
NM_001195683 chr1 92145899 92351836 1.4473e+03
输入文件2:
COL1 COL2 COL3 COL4 COL5 COL6 COL7 COL8 COL9
NM_032291 chr1 66999824 67210768 1.473e-04
NM_001080397 chr1 8384389 8404227 1.473e-03
NM_018090 chr1 16767166 16786584 1.473e-02
NM_032785 chr1 48998526 50489626 1.473e-01
NM_001145278 chr1 16767166 16786584 1.473e00
NM_013943 chr1 25071759 25170815 1.473e01
NM_001145277 chr1 16767166 16786584 1.473e02
NM_052998 chr1 33546713 33585995 1.473e03
NM_001195683 chr1 92145899 92351836 1.473e04
我只关心第1列中的值和每个文件的最后一列中所有输入文件中的标识符及其在column1中的顺序是固定的。而每个文件的最后一列中的值正在变化。其余的列不是很有趣,可以有任何价值。
我想要的是一个如下所示的最终文件:
NM_032291 1.4612e+01 1.473e-04
NM_001080397 1.0545e+01 1.473e-03
NM_018090 1.4473e+01 1.473e-02
NM_032785 5.4473e-01 1.473e-01
NM_001145278 1.0545e+02 1.473e00
NM_013943 1.473e-04 1.473e01
NM_001145277 1.4473e+01 1.473e02
NM_052998 1.4473e+02 1.473e03
NM_001195683 1.4473e+03 1.473e04
当然有三列,因为只有两个输入文件,但在三个文件的情况下,它将是四个,依此类推。
答案 0 :(得分:1)
data1 = ... # contents of file1
data2 = ... # contents of file2
data = [data1, data2]
# use [1:] to filter column headers
data_cells = [[line.split() for line in datum.split('\n')][1:]
for datum in data]
result = []
for line_sequence in zip(*data_cells):
col1 = line_sequence[0][0] # get row header
result.append([col1]) # and put it in a list
for line in line_sequence:
result[-1].append(line[-1])
out = '\n'.join([' '.join(line) for line in result])
print(out)
结果:
NM_032291 1.4612e+01 1.473e-04
NM_001080397 1.0545e+01 1.473e-03
NM_018090 1.4473e+01 1.473e-02
NM_032785 5.4473e-01 1.473e-01
NM_001145278 1.0545e+02 1.473e00
NM_013943 1.473e-04 1.473e01
NM_001145277 1.4473e+01 1.473e02
NM_052998 1.4473e+02 1.473e03
NM_001195683 1.4473e+03 1.473e04
这将扩展到任意多行和任意多个文件,前提是您对数据的保证(在column1中的顺序是固定的,而您只关心每行的第一列和最后一列)是真的。
答案 1 :(得分:1)
在这样的地方,Numpy数组派上用场,特别是T
方法。这与append
方法一起可能是您最好的选择......
因此,假设您的文件位于列表中
files = ['a.txt', 'b.txt', 'c.txt']
等...
然后,从每个文件中,您只需要最后一个col(现在)。这样做的功能非常简单......
def rdFl(fileName):
with open(fileName, 'r') as f:
f.readline() # get rid of the header ...
lst = [ float(l.split()[-1]) for l in f.readlines()]
return lst
现在,要从所有文件中获取值,只需将此函数映射到所有文件,如下所示:
allLastData = map(rdFl, files)
这将为您提供包含最后一个列中所有数字的列表。你想要的是这个列表的转置。所以将它转换为NumPy数组并进行转置,就像这样(假设你已完成import numpy as np
):
allLastData = np.array( map(rdFl, files) ).T
此时查看终端上的allLastData
,您就会明白我在说什么。我希望我不必编写一个只从一个文件中提供第一列的函数。我假设您可以自己编写该功能。因此,让我们说您有以下列表中的第一列:
firstCol = ['NM_032291', ..., ...]
然后您可以像这样迭代firstCol
和allData
的压缩值:
for fV, dat in zip(firstCol, allLastData):
print fv + '\t' + '\t'.join( map(str, dat) )
在这里,我刚刚编写了打印代码。我相信你可以把字符串写入文件中。