删除包含关键字的行

时间:2019-02-01 15:53:33

标签: python

前一段时间我已经开始学习python。我玩带有Mod的游戏,并且其中有很多我想编辑的.cfg文件。确切地说,我想删除以特定关键字开头的行。 在这个论坛和其他论坛上,我已经读了很多东西,但是似乎人们的目标有些许不同,对于我的情况来说,效果并不明显。

这些配置文件还有很多其他不同的配置。它跨越数百行。我只是将其精简了下来,以使其易于使用,直到提出解决方案为止。

我要删除包含ResourceCosts字样的整行。

MODULE
{
    name = USI_SwapController
    ResourceCosts = SpecializedParts,8,MaterialKits,40,ElectricCharge,40    
}
MODULE

这是我发现有人发布的代码,它只是将关键字RecourceCosts替换为空格。这很可能会起作用,但是在某些情况下,它可能使游戏崩溃或出现一些错误。我想删除包含该单词的整行。

key = "ResourceCosts"
with open("before.cfg", "rt") as fin:
    with open("after.cfg", "wt") as fout:
        for line in fin:
            fout.write(line.replace(key, ''))

我应该像readlines()一样在列表中制作整个文件。这是否意味着将要加载内存中的所有内容?

我并不是python(和一般的编码)的新手,但我真的很感谢一些建议,或者至少可以指导我正确地寻找这种情况下的内容。

谢谢!

2 个答案:

答案 0 :(得分:2)

+1(乔丹·辛格)。如果您担心内存占用空间,请改用yield:

def read_config():
    key = "ResourceCosts"
    with open("before.cfg", "rt") as fin:        
        for line in fin:
            if key not in line: # Check the line for your key
                yield line

这将使您能够独立处理每一行,而不必一次将整个文件读入内存。


如果您想要更多的pythonic内容:

def read_config():
    with open('before.cfg', 'rt') as f:
        yield from filter(lambda line: key not in line, f)

答案 1 :(得分:1)

您可以天真地检查该行是否包含您的密钥

key = "ResourceCosts"
with open("before.cfg", "rt") as fin:
    with open("after.cfg", "wt") as fout:
        for line in fin:
            if key not in line: # Check the line for your key
                fout.write(line)