#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. извините за беспокойство, дорогая, большое вам спасибо за вашу помощь и руководство.