【问题标题】:Parsing a tab separated file using python使用python解析制表符分隔的文件
【发布时间】:2015-09-13 01:45:24
【问题描述】:

我有一个类似这样的文件,这是一个制表符分隔的文本文件

  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' 的操作数类型不受支持

【问题讨论】:

  • 显然,该错误的确切措辞以及它所指的行是相关的。将其添加到您的问题中!
  • 请同时添加完整的for 循环,而不仅仅是带有注释的第一行。
  • 还有,你确定没有复制粘贴错误kkKk不一样!
  • 修复语法高亮

标签: python numpy pandas


【解决方案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

【讨论】:

  • 非常感谢您的回答。!!
  • 恐怕我在你的答案旁边看不到支票,因为我是新用户,所以我无法对你投票,对不起..:(
  • 沿着这条线我必须计算输出数据的熵,所以我在输出上应用了公式,熵 = - sum([ p * math.log(p) / math .log(2.0) for p in df ]) 但它会抛出错误,NameError: name 'math' is not defined 我可以知道如何完成它吗?
  • 我现在已将其添加为新问题
【解决方案2】:

为什么不使用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']

【讨论】:

  • 谢谢仁,您的答复,但MYFILE是选项卡分隔的文件,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和输出我需要的是行列/总和(列)
  • 然后用\t 替换空格并在问题中指定这样的要求。因为否则没有人会给你一个完全合适的答案。
  • 请更改标题。还有你的语法高亮。
  • 把标题改成什么?
  • 到一些描述你的问题的东西。由于您希望得到除 python 字符串数组以外的其他内容的答案,因此这是获得答案的唯一方法。
【解决方案3】:

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

这意味着k[1][1] 将超出范围。您的预期输出是什么,我可能会提供进一步的帮助

【讨论】:

  • 是的,这就是我需要数字的问题,这样我就可以找到 column 的总和,对于 [['Aaa 0.4567 0.6780'] 我只需要数字部分,以便所有行等等那么我需要找到列的总和
猜你喜欢
  • 2011-12-12
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-16
相关资源
最近更新 更多