前一段时间我已经开始学习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(和一般的编码)的新手,但我真的很感谢一些建议,或者至少可以指导我正确地寻找这种情况下的内容。
谢谢!
答案 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)