0

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

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

3 回答 3

0

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

import gzip
class Manual_Seq:

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

在这里,我们定义了一个名为 AA 的空列表来保存您的氨基酸。

        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)            
于 2017-07-18T07:46:07.020 回答
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......看起来像这样:

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
于 2017-07-18T07:39:14.383 回答
0

只是想知道你是否考虑过使用这个 BioPandas?

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

使用熊猫做你想做的事情应该更容易。你只需要使用:

df.column_name.unique()

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

于 2017-07-18T07:57:02.940 回答