如何搜索文件中的单词并用新行替换整行?

时间:2011-05-06 10:45:44

标签: python

我有一个文件(带有extension.hgx),其中包含以下数据:

length             =  0.00000783
height             =  48
RATIO              =  2
X                  =  1.0
Y                  =  1.0

我想打开文件并替换两行:


height             =  48
RATIO              =  2

使用:


height             =  8
RATIO              =  8

我尝试解析文件,可以搜索“height”和“RATIO”。不幸的是,我无法用新行替换该行并重新保存该文件。在我的情况下,问题是,在文件中,参数的值,例如高度(= 48)变化,有时间隙不均匀。我想用 - 替换这整行  身高= 8

我写了以下代码

import fileinput
import sys
f = open('test.hgx','r')
line_num = 0
search_phrase = "height"
for line in f.readlines():
    line_num += 1
    if line.find(search_phrase) >= 0:
        print line_num

newline='height                  =  8'
lnum=1
for line in fileinput.FileInput("test.hgx",inplace=1):
    if lnum==line_num:
        result = newline+"\n"
    else:
        result=line
    lnum=lnum+1    
    sys.stdout.write(result)
    print line

这无助于替换完整行并再次保存文件。返回空文件。非常感谢任何帮助。

此致 RIS

3 个答案:

答案 0 :(得分:2)

这是怎么回事?

with open('test.hgx') as f:  lines = f.read().splitlines()
with open('test.hgx', 'w') as f:
  for line in lines:
    if line.startswith('height') or line.startswith('RATIO'):  
      f.write(line.rsplit(' ', 1)[0] + ' 8\n')
    else:
      f.write(line + '\n')

答案 1 :(得分:1)

在找到“高度”行后,你需要在第一个循环中停止迭代:

if line.find(search_phrase) >= 0:
    print line_num
    break

答案 2 :(得分:0)

我建议使用正则表达式工具:

import re

regx = re.compile('^(([^ \t]+)[ \t]+=.+)',re.MULTILINE)

new = '''\
RATIO              =  8
sdjlkhbfvjhdbfjhsdoijhfsdhfksdhfh
height             =  8
'''

dic = dict(mat.group(2,1) for mat in regx.finditer(new))

regchange = re.compile('^('+'|'.join(dic.iterkeys())+')[ \t]+=[^\r\n]+',re.MULTILINE)

with open(filename,'r+') as f:
    content = f.read()
    f.seek(0,0)
    f.write(regchange.sub(lambda m: dic[m.group(1)],content))
    f.truncate()

你输入 new 你要在文件中发生的行,无论顺序是什么(这就是为什么我在我的例子中'height'行之前写'RATIO'行,以显示)

该程序设法获取用于创建正则表达式的词典 dic ,该词典允许搜索要替换的行并用 dic 作为与行的第一个名称相对应的值

行'sdjlkhbfvjhdbfjhsdoijhfsdhfksdhfh'并不重要。我把它放在新的地方,表明正则表达式 regx 仅匹配格式为'name = something'的行

此代码应该按原样运行。您只需将文件名称指定为 filename ;如果有任何错误,请给它。