使用python解析制表符分隔的文件

时间:2015-06-26 07:31:27

标签: python numpy pandas

我有一个看起来像这样的文件,这是一个标签分隔的文本文件

  aaa   0.0520852296    0.1648703511    0.1648703511
  bbb   0.1062639955    0.1632039268    0.1632039268
  ccc   1.4112745088    4.3654577641    4.3654577641
  ddd   0.4992644913    0.1648703511    0.1648703511
  eeee  0.169058175 0.1632039268    0.1632039268

,输出应为

aaa 0.0232736716    0.0328321936    0.0328321936
bbb 0.0474828153    0.0325003428    0.0325003428
ccc 0.6306113983    0.8693349271    0.8693349271
ddd 0.2230904597    0.0328321936    0.0328321936
eeee    0.0755416551    0.0325003428    0.0325003428

列的每一行/总和

对于这个.txt文件有很多行和列,我需要找到每列的列总和。第二列到最后一列,然后将每个数字行与列总和相除。 并将其打印为输出。 到目前为止,我已经完成了直到分裂和剥离,从那里我无法从第二行中选择选择。

import numpy as np
motif_path  = '/home/test/test.txt'
f         =open(motif_path,'r') 
x = f.readlines()
kk = [s.strip().split("\t") for s in x]

当我尝试的时候 for i in Kk[1][1],我收到了错误:

  

TypeError:+:'int'和'str'

的不支持的操作数类型

3 个答案:

答案 0 :(得分:1)

我看到了" numpy"标签,但你可能会考虑python" pandas"作为替代方案,您可以在几行内获得所需的输出;这样,您可以轻松地将每个条目除以其列/行的总和。

首先,您将文件作为数据框读入,然后对此数据帧的三列执行所需的操作。如果您愿意,您可以轻松地将此数据帧写回.txt文件(输出如下所示)。让我知道这是否符合您的需求以及您是否对此代码有疑问。

以下是代码:

import pandas as pd
f=open('myData.txt','r')
df = pd.DataFrame(pd.read_csv(f, sep='\t', header=None, names=['val1', 'val2', 'val3']))
print df
df.loc[:,"val1":"val3"] = df.loc[:,"val1":"val3"].div(df.sum(axis=0), axis=1)
print df
df.to_csv('output.txt', header=None,sep='\t', encoding='utf-8')

此脚本的输出将是:

          val1      val2      val3
aaa   0.052085  0.164870  0.164870
bbb   0.106264  0.163204  0.163204
ccc   1.411275  4.365458  4.365458
ddd   0.499264  0.164870  0.164870
eeee  0.169058  0.163204  0.163204

          val1      val2      val3
aaa   0.023274  0.032832  0.032832
bbb   0.047483  0.032500  0.032500
ccc   0.630611  0.869335  0.869335
ddd   0.223090  0.032832  0.032832
eeee  0.075542  0.032500  0.032500

和文件" output.txt"看起来像这样:

aaa 0.0232736716104 0.0328321936442 0.0328321936442
bbb 0.0474828152678 0.0325003427993 0.0325003427993
ccc 0.630611398322  0.869334927113  0.869334927113
ddd 0.223090459743  0.0328321936442 0.0328321936442
eeee    0.075541655057  0.0325003427993 0.0325003427993

答案 1 :(得分:0)

根据您提供的信息,kk将为[['Aaa 0.4567 0.6780'], ['Bibb 0.6783. 0.235'], ['Cccc 0.4567. 0.4567'], ['']]

这意味着k[1][1]将超出范围。你的预期产量是多少,我可以帮助进一步提高

答案 2 :(得分:0)

为什么不使用python的csv reader模块并将分隔符从,更改为空格?

import csv
motif_path  = '/home/test/test.txt'
with open(motif_path, 'rb') as csvfile:
    data = csv.reader(csvfile, delimiter=' ')
    for dI in data:
        print dI

<强>输出

['Aaa', '0.4567', '0.6780']
['Bibb', '0.6783', '0.235']
['Cccc', '0.4567', '0.4567']