在某些文本出现后,在文本文件中添加行

时间:2015-05-19 07:49:58

标签: python

我有一个我需要操作的文本文件。我希望在出现单词" exactarch"后添加一行。意味着每当" exactarch"发生了,我想在下一行添加文字。

E.g。如果这是原始文件内容,

[main]
cachedir=/var/cache/yum
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
distroverpkg=redhat-release
tolerant=1
exactarch=1
gpgcheck=1
plugins=1

我想将其更改如下:

[main]
cachedir=/var/cache/yum
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
distroverpkg=redhat-release
tolerant=1
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1

这就是我试图做的事情:

with open('file1.txt') as f:
    for line in input_data:
        if line.strip() == 'exactarch':  
            f.write('obsoletes=1')

显然这不起作用,因为我无法弄清楚如何计算和写入这一行。

4 个答案:

答案 0 :(得分:4)

您要求使用Python解决方案。但是使用更简单的工具可以解决这样的任务。

如果您使用的系统有sed,则可以使用simle one-liner执行此操作:

$ sed '/exactarch/aobsoletes=1' < in.txt

这是什么意思?

  • sed:可执行文件
  • /exactarch/:匹配包含exactarch
  • 的所有行
  • a:在当前行之后,追加一个带有以下文字的新行
  • obsoletes=1:要添加到新行中的文字

输出:

[main]
cachedir=/var/cache/yum
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
distroverpkg=redhat-release
tolerant=1
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1

修改

要修改文件,请使用选项-i并将文件作为参数:

$ sed -i '/exactarch/aobsoletes=1' in.txt

答案 1 :(得分:2)

The past说这很简单 - 替换文件中的单词并不是什么新鲜事。

如果要替换单词,可以使用在那里实现的解决方案。在您的背景下:

import fileinput

for line in fileinput.input(fileToSearch, inplace=True):
    print(line.replace("exactarch", "exactarch\nobsoletes=1"), end='')

答案 2 :(得分:2)

简单 - 读取所有行,找到正确的行并在找到后插入所需的行。将结果行转储到文件。

<script>
    myapp.controller( "subCtrl" , ["$scope",function($scope){
    alert("subCtrl created");
}]);  
</script>

<div ng-controller="subCtrl">
  sub.html loaded.
</div>

答案 3 :(得分:0)

我犹豫是否使用fileinput,b / c如果在“分析”阶段出现问题,您将在失败前的任何情况下留下文件。我会阅读所有内容,然后全力以赴。下面的代码确保:

  • 如果插入的值不是最后一项,则插入的值包含换行符'\ n'。
  • 不会通过检查下面的值来添加重复的插入值。
  • 迭代所有值,因为自上次代码片段运行以来已添加多个“exactarch = 1”。

希望这会有所帮助,尽管不像一两个班轮一样时尚。

with open('test.txt') as f:
    data = f.readlines()

insertValue = 'obsoletes=1'

for item in data:
    if item.rstrip() == 'exactarch=1': #find it if it's in the middle or the last line (ie. no '\n')
        point = data.index(item)

        if point+1 == len(data): #Will be inserted as new line since current exactarch=1 is in last position, so you don't want the '\n', right?
            data.insert(point+1, instertValue)
        else:
            if data[point + 1].rstrip() != insertValue: #make sure the value isn't already below exactarch=1
                data.insert(point+1, insertValue + '\n')
                print('insertValue added below "exactarch=1"')
            else:
                print('insertValue already exists below exactarch=1')

with open('test.txt','w') as f:
    f.writelines(data)