使用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?我找不到办法,想再核实一下(我要寻找的源物种是“严重急性呼吸综合征相关冠状病毒”)