Как напечатать предопределенную последовательность в python

#python #python-2.7 #python-3.x #bioinformatics #biopython

#python #python-2.7 #python-3.x #биоинформатика #biopython

Вопрос:

Я пытаюсь распечатать предопределенную последовательность из входного файла pdb на python, но я не получаю ожидаемого результата. Я новичок в python, и у меня также есть каталог импорта, но он не работает. ничего не отображается (не удается найти ошибку). Он просто работает без какого-либо вывода.

 import os

os.chdir('C:UsersVishnuDesktopTest_folderInput')


for path, dirs, pdbfile in os.walk('/C:UsersVishnuDesktopTest_folderInput'):
for line in pdbfile:
    if line[:6] != "HETATM":
        continue
    chainID = line[21:22]
    atomID = line[13:16].strip()
    if chainID not in ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'):
        continue
    if atomID not in ('C4B', 'O4B', 'C1B', 'C2B', 'C3B'):
        continue
    with open('C:UsersVishnuDesktopTest_folderInput', 'r') as fh:
        new = [line.rstrip() for line in fh]
    with open('C:UsersVishnuDesktopTest_folderOutput', 'w') as fh:
        [fh.write('%sn' % line) for line in new]
        fh.write((line.rstrip()))
 

Ожидаемый результат:

 HETATM 3788  C4B NAI A 302      52.695  15.486   8.535  1.00 57.28           C  
HETATM 3789  O4B NAI A 302      52.258  14.631   7.456  1.00 56.26           O  
HETATM 3794  C1B NAI A 302      53.348  13.816   7.022  1.00 53.44           C 
HETATM 3792  C2B NAI A 302      54.537  14.748   7.190  1.00 50.93           C  

HETATM 3789  O4B NAI A 302      52.258  14.631   7.456  1.00 56.26           O  
HETATM 3794  C1B NAI A 302      53.348  13.816   7.022  1.00 53.44           C 
HETATM 3792  C2B NAI A 302      54.537  14.748   7.190  1.00 50.93           C 
HETATM 3790  C3B NAI A 302      54.225  15.525   8.465  1.00 52.99           C  

HETATM 3794  C1B NAI A 302      53.348  13.816   7.022  1.00 53.44           C 
HETATM 3792  C2B NAI A 302      54.537  14.748   7.190  1.00 50.93           C 
HETATM 3790  C3B NAI A 302      54.225  15.525   8.465  1.00 52.99           C  
HETATM 3788  C4B NAI A 302      52.695  15.486   8.535  1.00 57.28           C  
HETATM 3792  C2B NAI A 302      54.537  14.748   7.190  1.00 50.93           C 
HETATM 3790  C3B NAI A 302      54.225  15.525   8.465  1.00 52.99           C  
HETATM 3788  C4B NAI A 302      52.695  15.486   8.535  1.00 57.28           C  
HETATM 3789  O4B NAI A 302      52.258  14.631   7.456  1.00 56.26           O  

HETATM 3790  C3B NAI A 302      54.225  15.525   8.465  1.00 52.99           C  
HETATM 3788  C4B NAI A 302      52.695  15.486   8.535  1.00 57.28           C  
HETATM 3789  O4B NAI A 302      52.258  14.631   7.456  1.00 56.26            O  
HETATM 3794  C1B NAI A 302      53.348  13.816   7.022  1.00 53.44           C 
 

тот же формат и для цепочки B.

Как распечатать предопределенную последовательность? строка [21:22] есть ли идентификатор цепочки, идентификатор цепочки может быть от A до H. Как определить идентификатор цепочки от A до H?

Я не могу печатать последовательно, может кто-нибудь сообщить мне, как напечатать предопределенную последовательность в python?

После ответа:

Я обновил приведенный выше код приведенным ниже кодом:

 n = 4
for chain, atoms in d.items():
    for atom, line in atoms.items():
        for i in range(len(atom)-n 1):
            for j in range(n):
                print d[chain][atomIDs[i j]]
            print
 

Я хочу расширить еще два абзаца, но не получить ожидаемый результат

Комментарии:

1. Привет, Виш. Вы можете сделать line = line.rstrip() после for line in pdbfile: , или вы можете сделать print(line, end='') , чтобы избежать печати двух символов новой строки.

2. После for line in pdbfile того, как я бы сделал chain = line[21:22] . В противном 21 случае и 22 являются магическими числами повсюду. И после этого я бы сделал if chain in ('A', 'B', ...) вместо нескольких if line[21:22] == "A/B/...":

3. Я бы делал atomID = line[12:16].strip() и делал if atomID in ('C4B', 'O4B', ...): вместо того, чтобы иметь несколько операторов if.

4. Вместо if line[:6] == "HETATM": этого я бы сделал if line[:6] != "HETATM": continue , чтобы избежать дополнительного уровня отступов.

Ответ №1:

Вот мои комментарии, объединенные в ответ:

 with open('1AHI.pdb') as pdbfile:
    for line in pdbfile:
        if line[:6] != "HETATM":
            continue
        chainID = line[21:22]
        atomID = line[13:16].strip()
        if chainID not in ('A', 'B'):
            continue
        if atomID not in ('C4B', 'O4B', 'C1B', 'C2B', 'C3B'):
            continue
        ## Either:
        print(line, end='')
        ## Or:
        print(line.rstrip(), end='n')
        ## Or if Python2.x:
        print line.rstrip()
 

Мои первые строки кода были написаны более 10 лет назад для анализа файлов PDB. Не отчаивайтесь. У вас впереди долгое и прекрасное путешествие.

PS Я думаю, что в наши дни mmCIF предпочтительнее PDB… Убедитесь, что вы прочитали спецификации для обоих форматов файлов.


Я обновил ответ, но, пожалуйста, имейте в виду, что этот сайт предназначен для решения конкретных проблем, а не для того, чтобы другие люди выполняли эту работу за вас. Обычно на это смотрят свысока.

 d = {}
chainIDs = ('A', 'B',)
atomIDs = ('C4B', 'O4B', 'C1B', 'C2B', 'C3B', 'C4B')
with open('1AHI.pdb') as pdbfile:
    for line in map(str.rstrip, pdbfile):
        if line[:6] != "HETATM":
            continue
        chainID = line[21:22]
        atomID = line[13:16].strip()
        if chainID not in chainIDs:
            continue
        if atomID not in atomIDs:
            continue
        try:
            d[chainID][atomID] = line
        except KeyError:
            d[chainID] = {atomID: line}

n = 4
for chainID in chainIDs:
    for i in range(len(atomIDs)-n 1):
        for j in range(n):
            print d[chainID][atomIDs[i j]]
        print
 

Комментарии:

1. спасибо, но я получаю сообщение об ошибке: File «C:/Users/Desktop/test_python.py «, строка 11 print(строка, конец =») ^ Ошибка синтаксиса: недопустимый синтаксис >>>

2. Попробуйте print line.rstrip() , если Python2.x. Если вы только начинаете изучать Python, то я настоятельно рекомендую вам изучать Python3 вместо Python2. Python3 — это настоящее и будущее. Python2 — это не так.

3. большое вам спасибо за ваше руководство и помощь, я отредактировал свой вопрос выше, не могли бы вы, пожалуйста, проверить? и, пожалуйста, направь меня

4. не могли бы вы проверить, как распечатать предопределенную последовательность? C4B, O4B, C1B, C2B, C3B

5. извините за беспокойство, дорогая, большое вам спасибо за вашу помощь и руководство.