【问题标题】:How to remove the redundant data from text file如何从文本文件中删除冗余数据
【发布时间】:2013-10-19 12:03:52
【问题描述】:

我已经计算了两个原子之间的距离并保存在 out.txt 文件中。生成的out文件是这样的。

N_TYR_A0002      O_CYS_A0037     6.12    
O_CYS_A0037      N_TYR_A0002     6.12
N_ALA_A0001      O_TYR_A0002     5.34
O_TYR_A0002      N_ALA_A0001     5.34

我的输出文件有重复,表示相同的原子和相同的距离。
如何删除多余的行。

我用这个程序计算距离(所有到所有原子)

from __future__ import division
from string import *
from numpy import *

def eudistance(c1,c2):
x_dist = (c1[0] - c2[0])**2
y_dist = (c1[1] - c2[1])**2
z_dist = (c1[2] - c2[2])**2
return math.sqrt (x_dist + y_dist + z_dist)

infile = open('file.pdb', 'r')
text = infile.read().split('\n')
infile.close()
text.remove('')

pdbid = []
#define the pdbid
spfcord = []
for g in pdbid:
ratom = g[0]
ratm1 = ratom.split('_')
ratm2 = ratm1[0]
if ratm2 in allatoms:
    spfcord.append(g)

#print spfcord[:10]

outfile1 = open('pairdistance.txt', 'w')
for m in spfcord:
name1 = m[0]
cord1 = m[1]
for n in spfcord:
    if n != '':
        name2 = n[0]
        cord2 = n[1]

        dist = euDist(cord1, cord2)
        if 7 > dist > 2:
            #print name1, '\t', name2, '\t', dist
            distances = name1 + '\t ' + name2 + '\t ' + str(dist)

            #print distances

            outfile1.write(distances)
            outfile1.write('\n')
outfile1.close()

【问题讨论】:

  • 请显示生成此输出的代码。
  • 如果要在out.txt生成之后删除重复项,请参考stackoverflow.com/questions/15830290/…(它将保留顺序)。我想您可能想要做的是修改生成 out.txt 的逻辑以省略重复项。
  • 我看到了那个代码。但问题是我的第一列和第二列是变量和交换。所以每次都要换新线。我将在这里添加我的代码
  • 这是一个如何删除前后重复的问题吗?即您不想显示 A->B 和 B->A,但每条边只有一个长度?还是只是将输出列表唯一化? (由上面的链接解决方案涵盖)
  • 这不是反向重复或冗余行的情况。我对所有人进行了距离计算。所以我的输出就是这样。我想删除重复的计算。

标签: python numpy


【解决方案1】:

如果你不关心订单:

def remove_duplicates(input_file):
    with open(input_file) as fr:
        unique = {'\t'.join(sorted([a1, a2] + [d]))
            for a1, a2, d in  [line.strip().split() for line in fr]
        }

    for item in unique:
        yield item

if __name__ == '__main__':
    for line in remove_duplicates('out.txt'):
        print line

但在计算距离和写入数据之前简单检查一下脚本中的 name1

【讨论】:

    【解决方案2】:

    好的,我有个主意。不假装这是最好或最干净的方式,但它很有趣......

    import numpy as np
    from StringIO import StringIO
    
    data_in_file = """
    N_TYR_A0002, O_CYS_A0037, 6.12    
    N_ALA_A0001, O_TYR_A0002, 5.34
    P_CUC_A0001, N_TYR_A0002, 9.56
    O_TYR_A0002, N_ALA_A0001, 5.34
    O_CYS_A0037, N_TYR_A0002, 6.12
    N_TYR_A0002, P_CUC_A0001, 9.56
    """
    
    # Import data using numpy, any method is okay really as we don't really on data being array's
    data_in_array = np.genfromtxt(StringIO(data_in_file), delimiter=",", autostrip=True, 
                                  dtype=[('atom_1', 'S12'), ('atom_2', 'S12'), ('distance', '<f8')])
    
    N = len(data_in_array['distance'])
    
    pairs = []
    
    # For each item find the repeated index
    for index, a1, a2 in zip(range(N), data_in_array['atom_1'], data_in_array['atom_2']):
        repeat_index = list((data_in_array['atom_2'] == a1) * (data_in_array['atom_1'] == a2)).index(True)
        pairs.append(sorted([index, repeat_index]))
    
    # Each item is repeated, so sort and remove every other one
    unique_indexs = [item[0] for item in sorted(pairs)[0:N:2]]
    
    atom_1 = data_in_array['atom_1'][unique_indexs]
    atom_2 = data_in_array['atom_2'][unique_indexs]
    distance = data_in_array['distance'][unique_indexs]
    
    for i in range(N/2):
        print atom_1[i], atom_2[i], distance[i]
    
    #Prints
    N_TYR_A0002 O_CYS_A0037 6.12
    N_ALA_A0001 O_TYR_A0002 5.34
    P_CUC_A0001 N_TYR_A0002 9.56
    

    我应该补充一点,这假设每一对都只重复一次,并且没有一对就不存在任何项目,这会破坏代码,但可以通过错误异常处理。

    请注意,我还使用"," 分隔符对您的输入数据文件进行了更改,并添加了另一对以确保排序不会破坏代码。

    【讨论】:

      【解决方案3】:

      让我们首先尝试避免生成重复项。更改这部分代码 -

      outfile1 = open('pairdistance.txt', 'w')
      length = len(spfcord)
      for i,m in enumerate(spfcord):
          name1 = m[0]
          cord1 = m[1]
          for n in islice(spfcord,i+1,length):
      

      添加导入:

      from itertools import islice
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-23
        • 1970-01-01
        • 1970-01-01
        • 2012-11-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多