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

使用python比较文件中不同行中的两个单词,python,python-2.7,protein-database,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

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

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的行的第四列,这是特定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”

而不是打印它们,制作一个列表,这样

print AA
变成

my_list.append(AA)
只是不要忘记在循环之前用
my_list=[]

现在您已经拥有了所有这些值,您可以循环遍历它们并从唯一的值中生成一个字符串。如果订单对您来说无关紧要,您可以使用
设置
,如下所示:

my_string = ''.join(set(my_list))
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
但如果顺序很重要,则必须循环浏览该列表:

my_string = ''
seen = []
for item in my_list:
    if item not in seen:
        seen.append(item)
        my_string += item
您可以在不查看
列表的情况下执行此操作,但这样做会有风险

无论如何,这一切都意味着在同一数据上循环两次,这是不需要的。您可以在主循环之前初始化
my_string=''
seen=[]
,并执行我在循环中执行的操作,而不是
print AA
。。。看起来是这样的:

my_string = ''.join(set(my_list))
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

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

import gzip
class Manual_Seq:

def parseSeq(self, path):
    with gzip.open(path,'r') as file_content:
在这里,我们定义了一个空列表,称为AAs来保存氨基酸

        AAs = []
        for line in file_content:
                if fields[3] not in AAs:
                    AAs.append(fields[3])
接下来,我对代码进行了一些概括,将行拆分为字段,以便根据需要提取各种字段

            fields = line.split(' ')
            line_index = fields[0]
            if line_index == 'ATOM':
我们检查一下氨基酸是否已经在氨基酸列表中。。。如果没有,那么我们将氨基酸添加到列表中。。。这具有消除氨基酸重复的效果

        AAs = []
        for line in file_content:
                if fields[3] not in AAs:
                    AAs.append(fields[3])
最后,我们使用空字符串
'
join()
方法将所有值连接成一个值

    return ''.join(AAs)            

只是想知道你是否考虑过使用这种生物制剂?

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

df.column_name.unique()
然后使用
“”连接列表中的字符串。连接(列表名称)

只是想澄清一下:为什么要将第一个
ASP
与第一个
MET
配对?是否与第三列中的匹配值有关?i、 e.您是否根据第3列中的条目对第4列值进行配对?@dathroguy这是为了打印出相关蛋白质的序列。如您所见,第三列是原子的名称,第四列是原子所属的序列。一个ASP序列中的原子总是按照特定的顺序排列的。这意味着ASP是该链序列中的第一个氨基酸,所以它类似于ASPMET…(其他一些氨基酸)。由于ASP总是有8个原子按这个顺序排列,我们不需要打印ASP*8,这是隐含的。很抱歉,我不够具体,我忘了提到可能有两个相同的氨基酸在同一个文件中,所以一个可能的输出可能是“ASP-MET-ASP-MET”。像ASP这样的氨基酸总是有8行,之后是另一个氨基酸。实际上我使用的是BioPython,但是因为有很多PDB文件没有在标题中指定序列,所以我必须为每个链手动提取它们。但如果真的那么简单,我会调查BioPandas的,谢谢!我可以问一下吗,我正在看biopandas文档,有没有一种方法可以通过搜索源物种来提取一组PDB ID?我找不到办法,想再核实一下(我要寻找的源物种是“严重急性呼吸综合征相关冠状病毒”)