在python中创建多个文件的目录

时间:2014-01-14 06:29:30

标签: python

我在代码中遇到了一个中间步骤,它需要来自用户的许多输入文件(输入文件的数量取决于用户并且不是固定的)并且将这些文件中的目录作为例如,输入文件如下所示:

输入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

当然有三列,因为只有两个输入文件,但在三个文件的情况下,它将是四个,依此类推。

2 个答案:

答案 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', ..., ...]

然后您可以像这样迭代firstColallData的压缩值:

for fV, dat in zip(firstCol, allLastData):
    print fv + '\t' + '\t'.join( map(str, dat) )

在这里,我刚刚编写了打印代码。我相信你可以把字符串写入文件中。