1

我有一些示例数据,如下所示:

ATOM    973  CG  ARG A  61     -21.593   8.884  69.770  1.00 25.13           C
ATOM    974  CD  ARG A  61     -21.610   7.433  69.314  1.00 23.44           C
ATOM    975  NE  ARG A  61     -21.047   7.452  67.937  1.00 12.13           N

我想通过添加偏移值来替换第 6 列,并且只替换第 6 列,在上面的情况下它是 308。

所以61+308 = 369,所以第6列的61应该换成369

我不能str.split()行,因为行距非常重要。

我尝试过使用str.replace(),但第 2 列中的值也可以与第 6 列重叠

我确实尝试反转该行并使用str.repalce(),但第 7、8、9、10 和 11 列中的值可能与str要替换的值重叠。

到目前为止,我所拥有的丑陋代码是(除了第 7、8、9、10 和/或 11 列中的值重叠之外,它部分有效):

with open('2kqx.pdb', 'r') as inf, open('2kqx_renumbered.pdb', 'w') as outf:
    for line in inf:
        if line.startswith('ATOM'):
            segs = line.split()
            if segs[4] == 'A':
                offset = 308
                number = segs[5][::-1]
                replacement = str((int(segs[5])+offset))[::-1]
                print number[::-1],replacement
                line_rev = line[::-1]
                replaced_line = line_rev.replace(number,replacement,1)
                print line
                print replaced_line[::-1]
                outf.write(replaced_line[::-1])

上面的代码在下面产生了这个输出。正如您在第二行中看到的那样,第 6 列没有更改,但在第 7 列中发生了更改。我认为通过反转字符串我可以绕过与第 2 列的潜在重叠,但我忘记了其他列,我真的不知道如何解决它。

ATOM    973  CG  ARG A  369     -21.593   8.884  69.770  1.00 25.13           C
ATOM    974  CD  ARG A  61     -21.3690   7.433  69.314  1.00 23.44           C
ATOM    975  NE  ARG A  369     -21.047   7.452  67.937  1.00 12.13           N
4

2 回答 2

2

data = """\
ATOM    973  CG  ARG A  61     -21.593   8.884  69.770  1.00 25.13           C
ATOM    974  CD  ARG A  61     -21.610   7.433  69.314  1.00 23.44           C
ATOM    975  NE  ARG A  61     -21.047   7.452  67.937  1.00 12.13           N"""

offset = 308
for line in data.split('\n'):
    line = line[:22] + "  {:<5d}  ".format(int(line[22:31]) + offset) + line[31:]
    print line

我还没有对空格进行精确计数,这只是一个粗略的估计。如果您想要更多的灵活性,而不仅仅是将数字 22 和 31 分散在代码中,您将需要一种方法来确定您的开始和结束索引(但这与我假设数据采用固定列格式的假设相反)。

于 2013-02-22T12:29:01.503 回答
1

您最好不要尝试自己解析PDB-files。

使用 PDB 解析器。例如,在不同的生物/计算化学软件包中有许多免费可用的

生物蟒

下面是使用 biopython 的方法,假设您输入的是raw.pdb

from Bio.PDB import PDBParser, PDBIO
parser=PDBParser()
structure = parser.get_structure('some_id', 'raw.pdb')
for r in structure.get_residues():
    r.id = (r.id[0], r.id[1] + 308, r.id[2])
io = PDBIO()
io.set_structure(structure)
io.save('shifted.pdb')

我用谷歌搜索了一下,在这里找到了解决您的特定问题的快速解决方案(没有第三方依赖项):

http://code.google.com/p/pdb-tools/

有——在许多其他有用的 pdb-python-script-tools 中——这个脚本pdb_offset.py

它是一个独立的脚本,我只是复制了它的pdb_offset方法来展示它的工作原理,你的三行示例代码位于raw.pdb

def pdbOffset(pdb_file, offset):
    """
    Adds an offset to the residue column of a pdb file without touching anything
    else.
    """

    # Read in the pdb file
    f = open(pdb_file,'r')
    pdb = f.readlines()
    f.close()

    out = []
    for line in pdb:
        # For and ATOM record, update residue number
        if line[0:6] == "ATOM  " or line[0:6] == "TER   ":
            num = offset + int(line[22:26])
            out.append("%s%4i%s" % (line[0:22],num,line[26:]))
        else:
            out.append(line) 

    return "".join(out)


print pdbOffset('raw.pdb', 308)

哪个打印

ATOM    973  CG  ARG A 369     -21.593   8.884  69.770  1.00 25.13           C
ATOM    974  CD  ARG A 369     -21.610   7.433  69.314  1.00 23.44           C
ATOM    975  NE  ARG A 369     -21.047   7.452  67.937  1.00 12.13           N
于 2013-02-22T13:24:48.607 回答