如何使用python替换文本文件中字段中的值

问题描述

我有一个看起来像这样的文件

;
[ atomtypes ]
  opls_BZCG BCG1    78.113999   0.000   A   2.9310E-01  1.9173E-01
[ moleculetype ]
; Name      nrexcl
BZCG        1
[ atoms ]
;   nr  type    resnr   residue atom    cgnr    charge  mass
    1   opls_BZCG   1       BZCG    BCG1        1       0       78.113999

我正在尝试使用 python 更改 [ atomtypes ] 标题下倒数第二个和最后一个字段中的值。交易是我正在运行一个迭代更新这个文件代码,所以我特别希望该字段成为目标,而不是正则表达式“2.931E-01”或“1.9173E-01”。我知道我们可以使用 awk 之类的东西,但我想知道这是否可以从 python 本身实现。

这是我目前所做的:

flag = 0
with open("file.itp") as f: 
  for line in f:
     iterable = line.strip().split()
        if flag:
            line.strip().split()[5] = sigma 
            line.strip().split()[6]) = eps 
            print("epsilon is {} and sigma is {}".format(eps,sigma))
        if "atomtypes" in iterable:
            flag = 1
        else:
            flag = 0

    f.close()

我正在更改 python 中的值,但我无法将该更改发送到文件本身。我该如何解决这个问题?

您的任何建议将不胜感激!

解决方法

在行上使用枚举,以便我们可以访问当前行和下一行

代码

def update_line(filenm,eps,sigma):
    with open(filenm,'r') as fin:
        lines = fin.readlines()
        
        for idx,line in enumerate(lines):
            if "atomtypes" in line:
                # Current line has marker,so change next line (i.e. index idx + 1)
                #   Split next line into fields 
                #   split from end so so only have three fields,namely:
                #    1) everything before next to last field,#    2) next to last field,#    3) last field)
                arr = lines[idx+1].rsplit(' ',maxsplit = 3)
                arr[-3],arr[-1] = f"{eps:e}",f"{sigma:e}"
                lines[idx+1] = ' '.join(arr) + "\n"  # last_val dropped the '\n' so add back
                break
        
    with open(filenm,'w') as fout:
        # Updated lines placed back into file
        fout.writelines(lines)
    

测试

update_line('test.txt',4.573133E-02,8.2737123E-01)

之前的文件 test.txt:

;
[ atomtypes ]
  opls_BZCG BCG1    78.113999   0.000   A   2.9310E-01  1.9173E-01
[ moleculetype ]
; Name      nrexcl
BZCG        1
[ atoms ]
;   nr  type    resnr   residue atom    cgnr    charge  mass
    1   opls_BZCG   1       BZCG    BCG1        1       0       78.113999

文件 test.txt 之后

;
[ atomtypes ]
  opls_BZCG BCG1    78.113999   0.000   A   4.573133e-02  8.273712e-01
[ moleculetype ]
; Name      nrexcl
BZCG        1
[ atoms ]
;   nr  type    resnr   residue atom    cgnr    charge  mass
    1   opls_BZCG   1       BZCG    BCG1        1       0       78.113999