根据每行的内容将PDB文本文件拆分为多个文件

时间:2016-11-22 05:35:22

标签: python python-2.7 python-3.x

我试图从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(在输入文件的第三列)并以链式方式保存输出文件单独的文件。

2 个答案:

答案 0 :(得分:0)

这里有一些代码可以读取fileName指定的PDB文件,并为找到的每个配体ID写一个输出文件,其中包含输入文件中以HETATM开头并包含{{1}的行在指定的位置显示NADA的信件:

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' ' 的单引号之间保留一个空格。