Как распечатать результат каждого цикла в один файл? - PullRequest
0 голосов
/ 19 апреля 2019

Я использую протокол оценки модели для Modeller. Он оценивает каждую модель и записывает свой результат в отдельный файл. Однако я должен запустить его для каждой модели и записать в один файл.

Это оригинальный код:

from modeller import *
from modeller.scripts import complete_pdb

log.verbose()    # request verbose output
env = environ()
env.libs.topology.read(file='$(LIB)/top_heav.lib') # read topology
env.libs.parameters.read(file='$(LIB)/par.lib') # read parameters

# read model file
mdl = complete_pdb(env, 'TvLDH.B99990001.pdb')

# Assess all atoms with DOPE:
s = selection(mdl)
s.assess_dope(output='ENERGY_PROFILE NO_REPORT', file='TvLDH.profile',
              normalize_profile=True, smoothing_window=15)

Я добавил цикл для оценки каждой модели за один прогон, однако я создаю несколько файлов (по одному для каждой модели) и хочу распечатать все оценки в одном файле

from modeller import *
from modeller.scripts import complete_pdb

log.verbose()    # request verbose output
env = environ()
env.libs.topology.read(file='$(LIB)/top_heav.lib') # read topology
env.libs.parameters.read(file='$(LIB)/par.lib') # read parameters

#My loop starts here
for i in range (1,1001):
    number=str(i)
    if i<10:
        name='000'+number
    else:
        if i<100:
           name='00'+number
        else:
             if i<1000:
                name='0'+number
             else:
                  name='1000'

# read model file
mdl = complete_pdb(env, 'TcP5CDH.B9999'+name+'.pdb')

# Assess all atoms with DOPE: this is the assesment that i want to print in the same file
s = selection(mdl)
savename='TcP5CDH.B9999'+name+'.profile'
s.assess_dope(output='ENERGY_PROFILE NO_REPORT', 
              file=savename,
              normalize_profile=True, smoothing_window=15)

Поскольку я новичок в программировании, любая помощь будет очень полезна!

1 Ответ

0 голосов
/ 02 мая 2019

Добро пожаловать :-) Похоже, вы очень близки.Давайте познакомим вас с использованием функции python и оператора .format ().

У вашего оригинала есть строка комментария # read model file, которая выглядит так, как будто это может быть функция, поэтому давайте попробуем это.Это может выглядеть примерно так:

from modeller import *
from modeller.scripts import complete_pdb

log.verbose()    # request verbose output
# I'm assuming this can be done just once
# and re-used for all your model files...
# (if not, the env stuff should go inside the
# read_model_file() function.
env = environ()
env.libs.topology.read(file='$(LIB)/top_heav.lib') # read topology
env.libs.parameters.read(file='$(LIB)/par.lib') # read parameters

def read_model_file(file_name):
    print('--- read_model_file(file_name='+file_name+') ---')
    mdl = complete_pdb(env, file_name)
    # Assess all atoms with DOPE:
    s = selection(mdl)
    output_file = file_name+'.profile'
    s.assess_dope(
        output='ENERGY_PROFILE NO_REPORT',
        file=output_file,
        normalize_profile=True,
        smoothing_window=15)

for i in range(1,1001):
    file_name = 'TcP5CDH.B9999{:04d}pdb'.format(i)
    read_model_file(file_name)

Используя .format () мы можем получить несколько проверок оператора if для 10?100?1000?В основном .format () заменяет {} фигурные скобки с аргументом (ами).Это может быть довольно сложно, но вам не нужно разбирать все это.

Пример: 'Hello {}!'.format('world') приводит к Hello world!.В материале {:04d} используется форматирование, которое в основном гласит: «Пожалуйста, создайте цифру-подстроку шириной 4 символа и заполните ее нулями, чтобы вы получили '0001', ..., '0999', '1000'. Просто {:4d} (без начального нуля) даст вам пробел с отступом»результаты (например, ' 1', ..., ' 999', '1000'. Вот еще немного о заполнении нулями: Отображение числа с ведущими нулями

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...