在Python中使用通配符替换文件中的一行

在Python中使用通配符替换文件中的一行,python,Python,所以希望我没有忽略正确的答案,但是。。。 与foo bar主题保持一致。 如果我有一个如下所示的文件: blah boo who bar blah blah bar blah blah foo some other chars bar blah black sheep 我希望能够替换以'foo'开头或包含'foo'的行,并在不了解以下内容的情况下替换整行 我当前的代码很糟糕,但是很有效,有没有一种方法可以不用加载文件,也不用循环?或者至少比这更有效 filein = open("file",

所以希望我没有忽略正确的答案,但是。。。 与foo bar主题保持一致。 如果我有一个如下所示的文件:

blah boo who
bar blah blah
bar blah blah
foo some other chars
bar blah
black sheep
我希望能够替换以
'foo'
开头或包含
'foo'的行,并在不了解以下内容的情况下替换整行

我当前的代码很糟糕,但是很有效,有没有一种方法可以不用加载文件,也不用循环?或者至少比这更有效

filein = open("file", "r")
fileout = open("file.tmp", "w")
for line in filein:
    if line.startswith("foo"):
        fileout.write( "foo"+"my new numbers")
    else:
        fileout.write( line.replace('', '') )
filein.close()
fileout.close()
os.rename("file.tmp", "file")

短得多的代码可以是:

import os
with open('file') as f1,open('file.tmp','w') as f2:
    lines=[x if 'foo' not in x.split() else "foo my new numbers\n" for x in f1]
    f2.writelines(lines)
os.rename("file.tmp", "file")           
或者如果文件很大:

import os
with open('data1.txt') as f1,open('file.tmp','w') as f2:
    for x in f1:
        if 'foo' in x.split():
            f2.write("foo my new numbers\n")
        else:
            f2.write(x)
os.rename("file.tmp", "file") 
其他选择: 如果text.split()中的“foo” 或:
如果re.sub(r'foo\b',text)

如果您可以使用正则表达式,并且文件可以放入内存中,那么这应该可以:

file = open("file", "r")
data = file.read()
file.close()
data = re.sub(re.compile("^(.*)(foo)(.*)$",re.MULTILINE),'foo my new numbers',data)
file = open("file1", "w")
file.write(data)
file.close()

这不适用于包含foo的字符串…为什么fileout.write(line.replace(“”),)而不仅仅是fileout.write(line)?如果字符串以“food”开头,会发生什么?这将在内存中无用地构建整个新文件内容,而不是流式处理。
file = open("file", "r")
data = file.read()
file.close()
data = re.sub(re.compile("^(.*)(foo)(.*)$",re.MULTILINE),'foo my new numbers',data)
file = open("file1", "w")
file.write(data)
file.close()