【问题标题】:python 2.7 search and replace multiple lines in a file [duplicate]python 2.7搜索和替换文件中的多行[重复]
【发布时间】:2019-03-26 09:41:37
【问题描述】:

我有一个应该接收的 python 函数:

  • 文件路径
  • 具有要查找的旧值和要替换它的新值的元组列表。

脚本应该生成用元组值(从旧到新)修改的相同文件。这是我迄今为止尝试过的:

def inplace_change(new_filename, old_string_new):
        for old_new in old_string_new:
            with open(new_filename, "rt") as fin:
                with open(new_filename, "wt") as fout:
                    for line in fin:
                        fout.write(line.replace(old_new[0], old_new[1]))

我通常会像这样将元组列表传递给他们:

[('PidFile=/path/xxx.pid',
        'PidFile=/path/xxx.' + container_name + '.pid'),
       ('LogFile=/xx/log/nc_zabbix_agentd.log',
        'LogFile=/xx/log/yyyy.' + container_name + '.log')
    ...]

然后是文件所在的正常路径。

我设法很容易地只替换了一个元组(单个旧字符串与新字符串),但是当我有列表时,我无法获得完成此操作的逻辑。有任何想法吗?

【问题讨论】:

  • 你看过re.sub吗?以编程方式编译一个模式来完成它。
  • 你有什么错误吗?
  • 没有错误。用这个版本的代码在这端得到一个空白文件。
  • 我还没有查看re.sub。我会检查一下,但一般不知道模块。
  • 您可以使用单个文件打开多个文件:stackoverflow.com/questions/4617034/…

标签: python python-2.7


【解决方案1】:

罪魁祸首

for old_new in old_string_new:

应该是

for old_val, new_val in old_string_new:

更改这一行

fout.write(line.replace(old_new[0], old_new[1]))

到此

fout.write(line.replace(old_val, new_val))

我已经把你的问题最小化了,下面的应该很容易理解了:

old_string_new  = [ ('old1', 'new1'), ('old2', 'new2'), ('old3', 'new3')]

for old_val, new_val in old_string_new: 
    print(old_val, new_val)

输出

old1 new1
old2 new2
old3 new3

编辑

经过测试的代码的详细答案,假设我们有一个文件如下:

list.txt:

old1 hello there
okay old2 you will be replaced
haha bye bye old3

使用代码

import fileinput as fp

def inplace_change(filename, old_string_new):
    for old_val, new_val in old_string_new:
        with fp.FileInput(filename, inplace=True, backup='.bak') as file:
            for line in file:
                print(line.replace(old_val, new_val), end='')


old_string_new  = [('old1', 'new1'), ('old2', 'new2'), ('old3', 'new3')]
inplace_change('list.txt', old_string_new)

输出 (list.txt)

new1 hello there
okay new2 you will be replaced
haha bye bye new3

【讨论】:

  • 它不会改变最终输出。它仍然不起作用。结果相同;一个空白文件。
  • 我非常怀疑,请在您的问题中发布使用这种方法的代码。
  • @wti 我正在添加一个详细的答案,我知道你需要a+ 而不是wt
  • @wti 请检查答案的编辑版本。
  • 嗨@DirtyBit,感谢您的回答,似乎需要做一些工作可能是正确的答案,但是壁虎的答案是开箱即用的,并且是第一位的。我的分析器出现此错误:print(line.replace(old_val, new_val), end='') SyntaxError: invalid syntax 似乎无论如何都可以轻松解决,但我已经有了一个可行的答案。
【解决方案2】:

试试这样的

import os

def replace_in_file(fn, replaces):
    with open(fn, 'r') as f1, open(fn+'.new', 'w') as f2:
        for line in f1.readlines():
            for a, b in replaces:
                line = line.replace(a, b)
            f2.write(line)
    os.rename(fn+'.new', fn)

replace_in_file('foo.txt', (('foo', 'bar'), ('hey', 'ho')))

【讨论】:

    猜你喜欢
    • 2021-10-19
    • 1970-01-01
    • 2018-12-22
    • 2023-03-31
    • 2013-09-09
    • 1970-01-01
    • 2010-09-07
    相关资源
    最近更新 更多