替换以某些字符开头的文件中的文本字符串

时间:2017-03-13 21:04:31

标签: python variables replace

我想通过在字符串的开头搜索特定字母来替换文件中的文本。例如,这是文件的一部分:

 6  HT     4.092000    4.750000   -0.502000     0     5     7
 7  HT     5.367000    5.548000   -0.325000     0     5     6
 8  OT    -5.470000    5.461000    1.463000     0     9    10
 9  HT    -5.167000    4.571000    1.284000     0     8    10
10  HT    -4.726000    6.018000    1.235000     0     8     9
11  OT    -4.865000   -5.029000   -3.915000     0    12    13
12  HT    -4.758000   -4.129000   -3.608000     0    11    13

我想使用“HT”作为搜索,并能够用2002替换“space0space”。当我尝试用2002替换所有0而不是只有0的列。之后我需要搜索“OT”并用2001替换0列。

所以基本上我需要搜索一个标识该行的字符串并替换一个特定于列的字符串,而其间的文本是可变的。输出需要打印到new_file.xyz。此外,我将在许多文件上反复执行此操作,因此成为可以在将要操作的文件前面键入的脚本会很棒。感谢。

2 个答案:

答案 0 :(得分:0)

这应该为你做(HT):

with open('file.txt') as f:
    lines = f.readlines()

new_lines = []

for line in lines:
    if "HT" in line:
        new_line = line.replace(' 0 ', '2002')
        new_lines.append(new_line)
    else:
        new_lines.append(line)


content = ''.join(new_lines)
print(content)


#  6  HT     4.092000    4.750000   -0.502000    2002    5     7
#  7  HT     5.367000    5.548000   -0.325000    2002    5     6
#  8  OT    -5.470000    5.461000    1.463000     0     9    10
#  9  HT    -5.167000    4.571000    1.284000    2002    8    10
# 10  HT    -4.726000    6.018000    1.235000    2002    8     9
# 11  OT    -4.865000   -5.029000   -3.915000     0    12    13
# 12  HT    -4.758000   -4.129000   -3.608000    2002   11    13

对其他行标识符重复相同的逻辑(添加到大小写或其他方式)。

如果你把它放在一个函数中,你可以使用它来替换id:

def _find_and_replace(current_lines, line_id, value):
    lines = []
    for l in current_lines:
        lines.append(l.replace(' 0 ', value)) if line_id in l else lines.append(l)
    return ''.join(lines)


with open('file.txt') as f:
    lines = f.readlines()
    new_lines = _find_and_replace(lines, line_id='HT', value='2002')
    print(new_lines)

但是,如果你有很多标识符,我会实现一个解决方案,它不会每次都通过行列表,而是在迭代行时查找标识符。

答案 1 :(得分:0)

使用fileinput模块,re.search()re.sub()函数的解决方案:

import fileinput, re

with fileinput.input(files=("lines.txt"), inplace=True) as f:
    for line in f:
        if (re.search(r'\bHT\b', line)):  # checks if line contains `HT` column
            print(re.sub(r' 0 ', '2002', line).strip())
        elif (re.search(r'\OT\b', line)): # checks if line contains `OT` column
            print(re.sub(r' 0 ', '2001', line).strip())
        else:
            print(line)

处理后的文件内容:

6  HT     4.092000    4.750000   -0.502000    2002    5     7
7  HT     5.367000    5.548000   -0.325000    2002    5     6
8  OT    -5.470000    5.461000    1.463000    2001    9    10
9  HT    -5.167000    4.571000    1.284000    2002    8    10
10  HT    -4.726000    6.018000    1.235000    2002    8     9
11  OT    -4.865000   -5.029000   -3.915000    2001   12    13
12  HT    -4.758000   -4.129000   -3.608000    2002   11    13
  

可选的就地过滤:如果关键字参数inplace=True传递给fileinput.input()FileInput   构造函数,文件被移动到备份文件,标准输出是   定向到输入文件(如果是与备份同名的文件)   文件已经存在,它将被静默替换)。这样做   可以编写一个过滤器来重写其输入文件。