我想通过在字符串的开头搜索特定字母来替换文件中的文本。例如,这是文件的一部分:
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。此外,我将在许多文件上反复执行此操作,因此成为可以在将要操作的文件前面键入的脚本会很棒。感谢。
答案 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
构造函数,文件被移动到备份文件,标准输出是 定向到输入文件(如果是与备份同名的文件) 文件已经存在,它将被静默替换)。这样做 可以编写一个过滤器来重写其输入文件。