繁体   English   中英

使用字符串 .replace() 函数更新文本文件中的行

[英]Using the string .replace() function to update lines in a text file

我正在尝试读取一个文本文件,然后如果子字符串与预期值不匹配,我想用策划值替换该子字符串。 我当前的代码与示例 .txt 文件一起在上面。

def update_atom_count(self, input_file):
    count = 0
    readFile = open(input_file, 'rt')
    writeFile = open(input_file, 'wt')
    for line in readFile:
        if line[0:6] == 'ATOM  ' or line[0:6] == 'TER   ':
            count += 1
            num = line[6:11]
            if int(num) != count:
                writeFile.write(line.replace(num, str(count)))
    writeFile.close()

示例 .txt 文件:

ATOM   1850  OG1 THR A 225     -17.240  12.451  -7.500  1.00 62.47           O
ATOM   1851  CG2 THR A 225     -16.343  13.019  -9.660  1.00 56.69           C
ATOM   1852  N   GLN A 226     -13.575  14.217  -9.123  1.00 57.64           N
ATOM   1853  CA  GLN A 226     -12.637  14.556 -10.203  1.00 68.89           C
ATOM   1854  C   GLN A 226     -11.192  14.229  -9.816  1.00 55.30           C
ATOM   1855  O   GLN A 226     -10.255  14.468 -10.580  1.00 40.73           O
ATOM   1856  CB  GLN A 226     -12.774  16.025 -10.644  1.00 82.60           C
ATOM   1857  CG  GLN A 226     -12.264  16.309 -12.072  1.00 72.63           C
ATOM   1858  CD  GLN A 226     -12.294  17.790 -12.444  0.39 66.96           C
ATOM   1859  OE1 GLN A 226     -12.864  18.615 -11.726  1.00 74.47           O
ATOM   1860  NE2 GLN A 226     -11.673  18.130 -13.572  1.00 46.12           N
ATOM   1861  N   ASP A 227     -11.025  13.673  -8.624  1.00 32.42           N
ATOM   1862  CA  ASP A 227      -9.731  13.184  -8.201  1.00 38.31           C
ATOM   1863  C   ASP A 227      -9.679  11.646  -8.233  1.00 45.89           C

我的目标是将文本的第二个“列”中的' 1850'替换为' 1' (额外的间距用于格式化)。 我期待的输出是:

ATOM      1  CG2 THR A 225     -16.343  13.019  -9.660  1.00 56.69           C
ATOM      2  N   GLN A 226     -13.575  14.217  -9.123  1.00 57.64           N
...

这是您的潜在解决方案:

#!/usr/bin/env python3
import os

def update_atom_count(self, input_file):
    count = 0
    readFile = open(input_file, 'rt')
    writeFile = open(input_file + '.temp' , 'wt')
    for line in readFile:
        columns=line.split()
        if columns[0] in set(  ['ATOM', 'TER'] ):
            count += 1
            print( columns[0], count, " ".join(columns[2:]) , file=writeFile )
        else:
            print( line.rstrip(), file=writeFile )

    writeFile.close()
    readFile.close()
    os.rename( input_file + '.temp', input_file ) 

我们的方法有几个不同之处:

  1. 我正在使用临时文件( input_file + '.temp' )。 另一方面,您正在写入同一个文件。 这样做让我感到不舒服,因为您同时打开文件进行读写。 这对我来说是未知的领域,所以我避免使用它并创建临时文件(或完全在内存中工作)。
  2. 我不关心格式 - 我们总是可以对输出进行后期处理(例如,我们可以将文件通过管道传输到column -t )。
  3. 最值得注意的是,我没有使用 replace() 函数。 这对我来说似乎很危险,因为我们要替换的号码可能会巧合地出现在线路上的任何其他地方。 我们不想意外修改数据,只修改带有计数的列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM