【问题标题】:Replace lines in file according to numeration in file根据文件中的编号替换文件中的行
【发布时间】:2025-11-29 21:55:02
【问题描述】:

我正在尝试将a[i] 列表中的新更改替换为原始er.pdb 文件 使用文件中的数字和列表中的项目。

这是列表中项目外观的示例。

['ATOM  168  N   MET A  48       6.674   9.818  33.156  1.00 45.09           N  ',
 'ATOM  169  CA  MET A  48       6.049  10.959  32.490  1.00 44.83           C  ',
 'ATOM  170  C   MET A  48       4.687  10.621  31.903  1.00 44.85           C  ']

这是文件er.pdb

HETATM  168  N   MSE A  48       6.674   9.818  33.156  1.00 45.09           N  
HETATM  169  CA  MSE A  48       6.049  10.959  32.490  1.00 44.83           C  
HETATM  170  C   MSE A  48       4.687  10.621  31.903  1.00 44.85           C 

所以两者都有相同的数字记录(168, 169, 170 等)

我能想到的一种方法是使用 pandas。但是,没有熊猫还有另一种方法吗? 这是我的代码。我使用正则表达式替换某些模式,例如 MSE 到 MET。

import re

with open('er.pdb','r') as f:
    contents = f.read()
    a = re.findall('.*HETATM.*\s{2}\d{3}\s{1,2}\w{1,2}.*MSE.*', contents)
    for i in range(len(a)):
        ### HETATM to ATOM
        a[i] = re.sub(r'^\w{6}', 'ATOM', a[i])
        ### SE to SD & spacing
        a[i] = re.sub(r' SE   MSE', '  SD  MET', a[i])
        ### MSE to MET
        a[i] = re.sub(r' MSE ', ' MET ', a[i])
        ### SE to S
        a[i] = re.sub(r'  SE  ', '   S  ', a[i])

提前致谢!

【问题讨论】:

  • 您的代码现在不工作了吗?如果没有,如果你得到任何输出/错误是什么?
  • 你的代码有什么问题?您是在寻求更优雅的解决方案,还是?
  • @bikalpa & @Elrond 支持 Monica 脚本工作,但是 a = re.findall... 将所有需要更改的行放入一个列表中,一旦列表中的这些项目在 a[i] 中更改,我需要将它们放回文件er.pdb

标签: python regex bioinformatics python-re


【解决方案1】:

根据您之前在问题中所做的评论,我了解到您已经对这些项目进行了更改,它们现在在列表中 a

现在将该列表写入文件,您可以这样做:

text_to_write = "\n".join(a)
with open("er.pdb", "w") as target_file:
    target_file.write(text_to_write)

【讨论】:

  • 谢谢!虽然我想使用每个新行的数字(第二列的数字,在 ATOM 或 HETATM 列之后)加入修改后的文件。您提供的方法将所有字符串连接在一起并用新数据替换所有旧数据。而我只想替换某些旧数据块。
  • 您要替换哪些特定的块?
  • 感谢您回来@bikalpa 我只想用新的块(例如,其中包含 HETATOM 和 MSE 记录的块)替换旧块(例如 ATOM 和 MET),而不是删除文件的其余部分未更改。