我试图从PDB输入文件中逐条提取NAD配体ID。我想保存输出文件,如下所示:如果输入文件是1AHI.pbd
并且包含四个链A,B,C和D,则输出应该是单独的文件
1AHI_A.txt
1AHI_B.txt
1AHI_C.txt
1AHI_D.txt
我的下面的脚本没有给出预期的输出。可能是脚本中的一些逻辑问题。我也收到任何错误。
from glob import glob
in_loc = 'C:/Users/Documents/NAD/NAD/result/test_result_file/'
out_loc = 'C:/Users/Documents/NAD/NAD/result/test_result_file/output/'
def test():
fnames = glob(in_loc+'*.pdb')
for each in fnames:
# This is the new generated file out of input file (.txt).
formatted_file = each.replace('pdb', 'txt')
formatted_file = formatted_file.replace(in_loc, out_loc)
# This is the input file
in_f = open(each, 'r')
# A new file to be opened.
out_f = open(formatted_file, "w")
# Filtering results from input file
try:
out_chain_list = filter_file(in_f)
for each_line in out_chain_list:
out_f.write(each_line)
# Closing all the opened files.
out_f.close()
in_f.close()
except Exception as e:
print('Exception for file: ', each, '\n', e)
out_f.close()
in_f.close()
def filter_file(in_f):
ligand_id = ['NAD']
chain_ids = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
previous_chain_id = None
chain_list = []
out_chain_list = []
for each in fnames:
for line in map(str.rstrip, fnames):
if line[:6] != "HETATM":
continue
chainID = line[21:22]
ligandID = line[11:14].strip()
if ligandID in ligandID and chain_id in chain_ids:
if chain_id != previous_chain_id:
c_ls = []
if c_ls:
out_file_name = in_f.name.replace(in_loc, out_loc)
out_file_name = out_file_name.replace('.pdb', '_'+previous_chain_id+'.txt')
out_file = open(out_file_name, "w")
for l in c_ls:
out_file.write(l)
out_file.close()
chain_list.append(line)
previous_chain_id = chain_id
out_chain_list += c_ls
return out_chain_list
test()
实施例
输入文件:类似
HETATM15202 PA NAD A 501 44.008 102.331 5.491 1.00 11.48 P
HETATM15203 O1A NAD A 501 43.295 103.140 6.507 1.00 11.48 O
HETATM15204 O2A NAD A 501 42.939 101.407 4.919 1.00 11.48 O
HETATM15205 O5B NAD A 501 45.052 101.397 6.166 1.00 11.48 O
HETATM15247 PA NAD B 501 36.790 111.512 38.592 1.00 11.25 P
HETATM15248 O1A NAD B 501 37.248 110.563 37.565 1.00 11.25 O
HETATM15249 O2A NAD B 501 35.692 110.795 39.337 1.00 11.25 O
HETATM15250 O5B NAD B 501 36.174 112.802 37.915 1.00 11.25 O
HETATM15292 PA NAD C 501 100.016 130.669 21.776 1.00 12.28 P
HETATM15293 O1A NAD C 501 99.311 131.864 22.293 1.00 12.28 O
HETATM15294 O2A NAD C 501 101.501 131.009 21.932 1.00 12.28 O
HETATM15295 O5B NAD C 501 99.727 130.510 20.238 1.00 12.28 O
HETATM15337 PA NAD D 501 78.237 158.792 22.383 1.00 11.99 P
HETATM15338 O1A NAD D 501 79.297 157.907 21.808 1.00 11.99 O
HETATM15339 O2A NAD D 501 78.807 160.217 22.362 1.00 11.99 O
HETATM15340 O5B NAD D 501 78.069 158.416 23.905 1.00 11.99 O
预期输出:
1AHI_A.txt:链输出(输出文件)
HETATM15202 PA NAD A 501 44.008 102.331 5.491 1.00 11.48 P
HETATM15203 O1A NAD A 501 43.295 103.140 6.507 1.00 11.48 O
HETATM15204 O2A NAD A 501 42.939 101.407 4.919 1.00 11.48 O
HETATM15205 O5B NAD A 501 45.052 101.397 6.166 1.00 11.48 O
1AHI_B.txt:B链输出(输出文件)
HETATM15247 PA NAD B 501 36.790 111.512 38.592 1.00 11.25 P
HETATM15248 O1A NAD B 501 37.248 110.563 37.565 1.00 11.25 O
HETATM15249 O2A NAD B 501 35.692 110.795 39.337 1.00 11.25 O
HETATM15250 O5B NAD B 501 36.174 112.802 37.915 1.00 11.25 O
1AHI_C.txt:C链输出(输出文件)
HETATM15292 PA NAD C 501 100.016 130.669 21.776 1.00 12.28 P
HETATM15293 O1A NAD C 501 99.311 131.864 22.293 1.00 12.28 O
HETATM15294 O2A NAD C 501 101.501 131.009 21.932 1.00 12.28 O
HETATM15295 O5B NAD C 501 99.727 130.510 20.238 1.00 12.28 O
1AHI_D.txt:D链输出(输出文件)
HETATM15337 PA NAD D 501 78.237 158.792 22.383 1.00 11.99 P
HETATM15338 O1A NAD D 501 79.297 157.907 21.808 1.00 11.99 O
HETATM15339 O2A NAD D 501 78.807 160.217 22.362 1.00 11.99 O
HETATM15340 O5B NAD D 501 78.069 158.416 23.905 1.00 11.99 O
我希望这会帮助你理解。
我想提取NAD(在输入文件的第三列)并以链式方式保存输出文件单独的文件。
答案 0 :(得分:0)
这里有一些代码可以读取fileName
指定的PDB文件,并为找到的每个配体ID写一个输出文件,其中包含输入文件中以HETATM
开头并包含{{1}的行在指定的位置显示NAD
到A
的信件:
Z
如果要处理多个输入文件,陷阱错误等,您将能够添加到此。请注意列表和集合理解的使用,这通常是转换或过滤一组数据的非常简洁的方法。如果您需要有关这些结构的更多详细信息,请查看Python帮助。
我在Python 3.5上测试了这个,但它应该在一些早期版本中运行 - 我认为集合理解在2.7中可用但我不确定何时引入了import os
fileName = 'C:\\path\\to\\file.pdb'
baseName = os.path.splitext(fileName)[0] # get filename without extension
# Read the lines from the input file that have 'HETATM' and 'NAD' in the
# correct positions into a list:
with open(fileName) as f:
linesNAD = [li for li in f if li[0:6] == 'HETATM' and li[17:20] == 'NAD']
# Build a set of the chains found in the lines we have read in:
chains = {li[21] for li in linesNAD if li[21] in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'}
# For each chain, create an output file and write the lines for that chain:
for chain in chains:
outfileName = baseName + '_' + chain + '.txt'
with open(outfileName, 'w') as o:
o.writelines([li for li in linesNAD if li[21] == chain])
结构。如果它在您的版本中不起作用,只需像在原始代码中那样打开文件(但不要忘记之后with
!)
答案 1 :(得分:0)
我知道这是一个旧线程,但由于我遇到了这个问题,当我正在寻找解决问题的方法时,我认为最好分享一个简单的解决方案。我知道问题是让 Python 脚本正常工作,但我认为如果我将这个简单的单行解决方案(基于 UNIX)留在这里,人们可能会发现它很有用。
awk -F' ' '{print > "1AHI_"$5".txt"}' infile.pdb
如果由于 PDB 文件的第二列中的行号增加而没有空格,只需在字符串 HETATM
后插入一个空格来分隔第 1 列和第 2 列。所有这些都可以在一个衬垫中完成,如下所示。
sed 's/HETATM/HETATM /1' infile.pdb | awk -F' ' '{print > "1AHI_"$5".txt"}'
-F' '
将在空白处拆分列,而 $5
表示 awk
在 $5
中的唯一值上拆分文件。您必须在 -F' '
的单引号之间保留一个空格。