在Python中搜索并替换文件中的一行

在Python中搜索并替换文件中的一行

我想循环一个文本文件的内容,并在一些行上进行搜索和替换,并将结果写回该文件。我可以先在内存中加载整个文件,然后将其写回去,但这可能不是最好的方法。

在下面的代码中,最好的方法是什么?

f = open(file)for line in f:
    if line.contains('foo'):
        newline = line.replace('foo', 'bar')
        # how to write this newline back to the file


天涯尽头无女友
浏览 2239回答 3
3回答

慕盖茨4494581

最短的方法可能是使用文件输入模块..例如,以下内容将行号添加到文件中:import fileinputfor line in fileinput.input("test.txt", inplace=True):     print "%d: %s" % (fileinput.filelineno(), line),这里发生的是:原始文件被移动到备份文件中。标准输出重定向到循环中的原始文件。因此任何print语句写入原始文件中。fileinput有更多的钟声和口哨。例如,它可以用于对sys.args[1:],而不必显式地迭代它们。从Python3.2开始,它还提供了一个方便的上下文管理器,用于with声明。当fileinput对于丢弃的脚本来说,这是很棒的,我会谨慎地在实际代码中使用它,因为无可否认,它不是很可读的或熟悉的。在实际的(生产)代码中,只需再花几行代码就可以使流程显式化,从而使代码具有可读性。有两种选择:该文件不太大,您只需将其全部读入内存即可。然后关闭文件,以写入模式重新打开它,并将修改后的内容写回。该文件太大,无法存储在内存中;您可以将其移到临时文件中,然后打开该文件,逐行读取该文件,然后将其写入原始文件。请注意,这需要两倍的存储。

浮云间

下面是另一个经过测试的示例,它将匹配搜索和替换模式:import fileinputimport sysdef replaceAll(file,searchExp,replaceExp):     for line in fileinput.input(file, inplace=1):         if searchExp in line:             line = line.replace(searchExp,replaceExp)         sys.stdout.write(line)示例使用:replaceAll("/fooBar.txt","Hello\sWorld!$","Goodbye\sWorld.")
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python