使用python比较文件中不同行的两个单词

时间:2017-07-18 07:32:27

标签: python python-2.7 protein-database

我正在处理来自蛋白质数据库的文件,看起来像这样。

SITE     2 AC1 15 ASN A 306  LEU A 309  ILE A 310  PHE A 313                    
SITE     3 AC1 15 ARG A 316  LEU A 326  ALA A 327  ILE A 345                    
SITE     4 AC1 15 CYS A 432  HIS A 435  HOH A 504                               
CRYST1   64.511   64.511  111.465  90.00  90.00  90.00 P 43 21 2     8          
ORIGX1      1.000000  0.000000  0.000000        0.00000                         
ORIGX2      0.000000  1.000000  0.000000        0.00000                         
ORIGX3      0.000000  0.000000  1.000000        0.00000                         
SCALE1      0.015501  0.000000  0.000000        0.00000                         
SCALE2      0.000000  0.015501  0.000000        0.00000                         
SCALE3      0.000000  0.000000  0.008971        0.00000                         
ATOM      1  N   ASP A 229      29.461  51.231  44.569  1.00 47.64           N  
ATOM      2  CA  ASP A 229      29.341  51.990  43.290  1.00 47.13           C  
ATOM      3  C   ASP A 229      30.455  51.566  42.330  1.00 45.62           C  
ATOM      4  O   ASP A 229      31.598  51.376  42.743  1.00 47.18           O  
ATOM      5  CB  ASP A 229      29.433  53.493  43.567  1.00 49.27           C  
ATOM      6  CG  ASP A 229      28.817  54.329  42.463  1.00 51.26           C  
ATOM      7  OD1 ASP A 229      27.603  54.172  42.206  1.00 53.47           O  
ATOM      8  OD2 ASP A 229      29.542  55.145  41.856  1.00 52.96           O  
ATOM      9  N   MET A 230      30.119  51.424  41.051  1.00 41.99           N  
ATOM     10  CA  MET A 230      31.092  51.004  40.043  1.00 36.38           C  

首先,我只需要提取标记为ATOM的第四列,这是特定原子所属的氨基酸序列。我在这里做过。

import gzip
class Manual_Seq:

    def parseSeq(self, path):
        with gzip.open(path,'r') as file_content:
            for line in file_content:
                newLine = line.split(' ')[0]
                if newLine == 'ATOM':
                    AA = line[17]+line[18]+line[19]
                    print AA

产生此

的输出
ASP
ASP
ASP
.....
MET

但我现在需要的是仅输出第一个ASP和第一个MET等,并将它们连接起来以便它看起来像这样。

ASPMET

我在想也许我会尝试迭代一行并进行比较直到它与第一个输出不同,但我不确定如果你有任何其他想法或任何改进我会怎么做我的代码请随时提交您的建议,谢谢。 我还需要提一下,在一个文件中实际上可以有两个相同的氨基酸,因此输出可能是" ASP MET ASP"

4 个答案:

答案 0 :(得分:0)

不是打印它们,而是列出一个列表,所以

print AA

变为

my_list.append(AA)

不要忘记在使用my_list=[]

的循环之前初始化列表

现在您拥有了所有这些值,您可以遍历它们并使用唯一值创建一个字符串。如果订单对您不重要,则可以使用set这样:

my_string = ''.join(set(my_list))

但是如果订单很重要,你必须遍历该列表:

my_string = ''
seen = []
for item in my_list:
    if item not in seen:
        seen.append(item)
        my_string += item

您可以在没有seen列表的情况下执行此操作,但这样做会有风险

无论如何,这意味着你在相同的数据上循环两次,这是不需要的。而不是所有这些,您可以在主循环之前初始化my_string=''seen=[],并在循环中执行我所做的而不是print AA ...这看起来像这样:< / p>

def parseSeq(self, path):
    with gzip.open(path,'r') as file_content:
        my_string = ''
        seen = []
        for line in file_content:
            newLine = line.split(' ')[0]
            if newLine == 'ATOM':
                AA = line[17]+line[18]+line[19]
                if AA not in seen:
                    seen.append(AA)
                    my_string += AA
        return my_string # or print my_string

答案 1 :(得分:0)

首先,您不需要从行字符串中挑选字符。您可以使用str.split()获取每行的字符串列表。

您可以做的是维护一个列表和一组序列。该集用于高效查找,列表按顺序存储符号。

seq_list = []
seq_set = {}

for line in file_content:
    items = line.split()
    if items[0] == 'ATOM':
        AA = items[3]
        if AA not in seq_set:
            seq_list.append(AA)
            seq_set.add(AA)

在循环之外,您可以加入像这样的列表项:

print(''.join(seq_list))

我将序列保留在列表中,这样您就可以对每个序列进行细粒度的访问/控制,如果您想要做的不仅仅是打印它们。

答案 2 :(得分:0)

我在现有代码中添加了一些代码:

import gzip
class Manual_Seq:

def parseSeq(self, path):
    with gzip.open(path,'r') as file_content:

这里我们定义一个空列表,称为AAs来保存你的氨基酸。

        AAs = []
        for line in file_content:

接下来,我将您的代码稍微概括一下,将行拆分为字段,以便我们可以根据需要提取各种字段。

            fields = line.split(' ')
            line_index = fields[0]
            if line_index == 'ATOM':

我们检查一下氨基酸是否已列入氨基酸列表中......如果没有,那么我们将氨基酸添加到列表中......这具有重复数据删除氨基酸的效果。

                if fields[3] not in AAs:
                    AAs.append(fields[3])

最后,我们使用空字符串''join()方法将所有值连接成单个值。

    return ''.join(AAs)            

答案 3 :(得分:0)

想知道你是否考虑使用这种BioPandas?

https://rasbt.github.io/biopandas/tutorials/Working_with_PDB_Structures_in_DataFrames/

使用pandas做你想做的事情会更容易。 你只需要使用:

df.column_name.unique()

然后使用"".join(list_name)在列表中连接字符串 https://docs.python.org/3/library/stdtypes.html#str.join