我正在处理来自蛋白质数据库的文件,看起来像这样。
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"
答案 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